与任何用户提供的数据一样,需要对URL进行转义和过滤,以避免各种漏洞。我希望能够
将用户提供的网址放在href
个属性中。 (如果我忘记写引号,如果我不搞砸,可以获得奖励)
<a href="ESCAPED_USER_URL_GOES_HERE">...</a>
禁止恶意网址,例如javascript:
内容或指向邪恶域名的链接。
为用户留出一些余地。我不想因为忘记添加http://
或类似内容而引发错误。
不幸的是,我找不到任何针对此类问题的“规范”解决方案。我唯一可以找到灵感来自Javascript的encodeURI
函数,但这对我的第二点没有帮助,因为它只是做一个简单的URL参数编码,但只留下:
等特殊字符和/
。
答案 0 :(得分:3)
OWASP提供了regular expressions for validating user input的列表,其中一个用于验证URL。这就像你要达到一个语言中立的,规范的解决方案一样接近。
您更有可能依赖于正在使用的编程语言的URL解析库。或者,使用URL parsing regex。
工作流程如下:
http:
。 http:
,https:
,ftp:
,mailto:
等。)
mailto:
协议将是必不可少的。很难想象javascript:
和data:
协议的用例。 禁止恶意网址,例如javascript:stuff或链接或邪恶域名。
您可以利用Google Safe Browsing API检查域名中是否存在间谍软件,垃圾邮件或其他“恶意”。
答案 1 :(得分:0)
对于第一点,常规属性编码工作得很好。 (将字符转义为HTML实体。如果保证属性为引号,则转义引号,符号和括号是正常的。转义其他字母数字字符将使属性安全,如果它被意外取消引用。
第二点含糊不清,取决于你想做什么。请记住使用白名单方法而不是黑名单,可以使用html实体编码和其他技巧来解决大多数简单的黑名单。