3

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

  • 将用户提供的 URL 放入href属性中。(如果我忘记写引号,我不会被搞砸,加分)

    <a href="ESCAPED_USER_URL_GOES_HERE">...</a>
    
  • 禁止恶意 URL,例如javascript:东西或指向恶意域名的链接。

  • 给用户一些回旋余地。我不想仅仅因为他们忘记添加http://或类似的东西而引发错误。

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

4

2 回答 2

3

OWASP 提供了一个用于验证用户输入的正则表达式列表,其中一个用于验证 URL。这与您将获得语言中立的规范解决方案一样接近。

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

工作流程将类似于:

  1. 验证提供的字符串是格式正确的 URL。
  2. 提供默认协议,例如http:未指定协议时。
  3. 维护可接受协议的白名单(http:https:ftp:mailto:等)
    1. 白名单将是特定于应用程序的。对于地址簿应用程序来说,mailto:协议是必不可少的。很难想象javascript:data:协议的用例。
  4. 实施最大 URL 长度- 确保跨浏览器 URL 并防止攻击者使用兆字节长度的字符串污染页面。运气好的话,你的 URL 解析库会为你做这件事。
  5. 为使用上下文编码一个 URL 字符串。(转义用于 HTML 输出,转义用于 SQL 查询等)。

禁止恶意 URL,例如 javascript: stuff 或 links 或恶意域名。

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

于 2013-02-11T07:33:59.940 回答
0

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

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

于 2013-02-12T00:16:59.800 回答