如何安全地将用户提供的URL添加到HTML页面?
与任何用户提供的数据一样,URL需要进行转义和适当过滤,以避免各种利用漏洞的行为。我希望能够如何安全地将用户提供的URL添加到HTML页面?,html,url,encoding,Html,Url,Encoding,与任何用户提供的数据一样,URL需要进行转义和适当过滤,以避免各种利用漏洞的行为。我希望能够 将用户提供的URL放入href属性中。(如果我忘了写报价,如果我没有被搞砸,就可以获得额外的分数) 禁止恶意URL,如javascript:内容或指向恶意域名的链接 给用户留点余地。我不想仅仅因为他们忘记添加http://之类的东西而引发错误 不幸的是,我找不到任何解决这类问题的“规范”解决方案。我唯一能找到灵感的是Javascript中的encodeURI函数,但这对我的第二点没有帮助,因为它
- 将用户提供的URL放入
属性中。(如果我忘了写报价,如果我没有被搞砸,就可以获得额外的分数)href
- 禁止恶意URL,如
内容或指向恶意域名的链接javascript:
- 给用户留点余地。我不想仅仅因为他们忘记添加
之类的东西而引发错误http://
encodeURI
函数,但这对我的第二点没有帮助,因为它只做了一个简单的URL参数编码,而不考虑特殊字符,如:
和/OWASP提供了一个列表,其中一个用于验证URL。这是一个语言中立、规范的解决方案
更可能的情况是,您将依赖正在使用的编程语言的URL解析库。或者,使用一个
工作流程类似于:
验证提供的字符串是否为格式正确的URL
如果未指定协议,请提供默认协议,如http:
李>
http:
,https:
,ftp:
,mailto:
等)
mailto:
协议是必不可少的。很难想象javascript:
和data:
协议的用例李>
您可以利用检查域中是否存在间谍软件、垃圾邮件或其他“邪恶” 对于第一点,常规属性编码工作得很好。(将字符转义为HTML实体。如果属性保证为引号,则转义引号、符号和方括号是可以的。如果属性意外未被引号括起,转义其他字母数字字符将使属性安全
第二点是模糊的,取决于你想做什么。记住使用白名单而不是黑名单——可以使用html实体编码和其他技巧绕过最简单的黑名单。什么是“邪恶的域名”?任何代码逻辑怎么能区分邪恶和善良?还有……你是说你想放置用户提供的URL,但禁止“链接”。这到底是什么意思?@eis:我对目的含糊不清。例如,“邪恶”可能是来自我的黑名单。重要的一点是,我希望能够分析URL(例如,仅使用encodeURI无法做到这一点)。至于“链接”另外,请注意,验证总是一种折衷方法。例如,OWASP站点中为URL提供的regex接受
http://google
作为有效的url,但不是www.google.com
或http://www.hän.fi/
(一个示例)。它还接受http://user:pass@domain.com
,这可能不是您希望允许的内容。
<a href="ESCAPED_USER_URL_GOES_HERE">...</a>