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

如何安全地将用户提供的URL添加到HTML页面?,html,url,encoding,Html,Url,Encoding,与任何用户提供的数据一样,URL需要进行转义和适当过滤,以避免各种利用漏洞的行为。我希望能够 将用户提供的URL放入href属性中。(如果我忘了写报价,如果我没有被搞砸,就可以获得额外的分数) 禁止恶意URL,如javascript:内容或指向恶意域名的链接 给用户留点余地。我不想仅仅因为他们忘记添加http://之类的东西而引发错误 不幸的是,我找不到任何解决这类问题的“规范”解决方案。我唯一能找到灵感的是Javascript中的encodeURI函数,但这对我的第二点没有帮助,因为它

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

  • 将用户提供的URL放入
    href
    属性中。(如果我忘了写报价,如果我没有被搞砸,就可以获得额外的分数)

    
    
  • 禁止恶意URL,如
    javascript:
    内容或指向恶意域名的链接

  • 给用户留点余地。我不想仅仅因为他们忘记添加
    http://
    之类的东西而引发错误

不幸的是,我找不到任何解决这类问题的“规范”解决方案。我唯一能找到灵感的是Javascript中的
encodeURI
函数,但这对我的第二点没有帮助,因为它只做了一个简单的URL参数编码,而不考虑特殊字符,如
/

OWASP提供了一个列表,其中一个用于验证URL。这是一个语言中立、规范的解决方案

更可能的情况是,您将依赖正在使用的编程语言的URL解析库。或者,使用一个

工作流程类似于:

  • 验证提供的字符串是否为格式正确的URL
  • 如果未指定协议,请提供默认协议,如http:
  • 维护可接受协议的白名单(
    http:
    https:
    ftp:
    mailto:
    等)
  • 白名单将是特定于应用程序的。对于通讯簿应用程序,
    mailto:
    协议是必不可少的。很难想象
    javascript:
    data:
    协议的用例
  • 强制a-确保跨浏览器URL,并防止攻击者使用兆字节长度的字符串污染页面。如果运气好的话,你的URL解析库会帮你做到这一点
  • 为使用上下文编码URL字符串。(转义用于HTML输出,转义用于SQL查询等) 禁止恶意URL,如javascript:stuff或links或恶意域名。


    您可以利用检查域中是否存在间谍软件、垃圾邮件或其他“邪恶”

    对于第一点,常规属性编码工作得很好。(将字符转义为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>