如何安全地将用户提供的URL添加到我的HTML页面?

时间:2013-02-11 06:09:54

标签: html url encoding

与任何用户提供的数据一样,需要对URL进行转义和过滤,以避免各种漏洞。我希望能够

  • 将用户提供的网址放在href个属性中。 (如果我忘记写引号,如果我不搞砸,可以获得奖励)

    <a href="ESCAPED_USER_URL_GOES_HERE">...</a>
    
  • 禁止恶意网址,例如javascript:内容或指向邪恶域名的链接。

  • 为用户留出一些余地。我不想因为忘记添加http://或类似内容而引发错误。

不幸的是,我找不到任何针对此类问题的“规范”解决方案。我唯一可以找到灵感来自Javascript的encodeURI函数,但这对我的第二点没有帮助,因为它只是做一个简单的URL参数编码,但只留下:等特殊字符和/

2 个答案:

答案 0 :(得分:3)

OWASP提供了regular expressions for validating user input的列表,其中一个用于验证URL。这就像你要达到一个语言中立的,规范的解决方案一样接近。

您更有可能依赖于正在使用的编程语言的URL解析库。或者,使用URL parsing regex

工作流程如下:

  1. 验证提供的字符串是格式正确的URL。
  2. 如果未指定协议,请提供默认协议,例如http:
  3. 维护可接受协议的白名单(http:https:ftp:mailto:等。)
    1. 白名单将是特定于应用程序的。对于地址簿应用程序,mailto:协议将是必不可少的。很难想象javascript:data:协议的用例。
  4. 强制执行maximum URL length - 确保跨浏览器的网址,并防止攻击者使用兆字节长度的字符串污染页面。幸运的是,您的URL解析库将为您完成此任务。
  5. 为使用上下文编码URL字符串。 (转义为HTML输出,转义以用于SQL查询等)。
  6.   

    禁止恶意网址,例如javascript:stuff或链接或邪恶域名。

    您可以利用Google Safe Browsing API检查域名中是否存在间谍软件,垃圾邮件或其他“恶意”。

答案 1 :(得分:0)

对于第一点,常规属性编码工作得很好。 (将字符转义为HTML实体。如果保证属性为引号,则转义引号,符号和括号是正常的。转义其他字母数字字符将使属性安全,如果它被意外取消引用。

第二点含糊不清,取决于你想做什么。请记住使用白名单方法而不是黑名单,可以使用html实体编码和其他技巧来解决大多数简单的黑名单。