【问题标题】:Is it safe to allow links that start with # (hash)?允许以#(哈希)开头的链接是否安全?
【发布时间】:2012-02-03 06:29:18
【问题描述】:

我正在构建一个 web 应用程序,用户可以动态创建 HTML 内容。允许他们创建以# 开头的链接是否安全(例如 w.r.t. XSS 攻击)?

我不知道为什么不会——也许我只是偏执。 (对于# URL,我的 Javascript 代码没有做任何特别的事情。)

无论如何,我问的一个原因是我正在使用Google Caja's html-sanitizer 来清理 HTML。它过滤 URL:s,然而默认过滤器看起来像这样:

function urlX(url) { if(/^https?:\/\//.test(url)) { return url }}

即必须指定协议,并且只允许HTTP和HTTPS,但不允许javascript:。我最近把URL过滤功能改成了:

function urlX(url) {
  if (/^https?:\/\//.test(url) || /^#/.test(url)) return url;
}

(也就是说,#.... 也是允许的。)

我想也许我应该问一下您是否认为#... 链接安全?

(例如,浏览器不会对像 `href='#javascript:....' 这样的链接做任何疯狂的事情?好吧它不会(反正不是我的浏览器),但也许还有其他一些.. .something...我不知道)

【问题讨论】:

    标签: security url xss google-caja


    【解决方案1】:

    应该是安全的:URL 中 # 之后的任何内容都会被浏览器解析为 fragment identifier

    当然,如果您的页面上有一些 JavaScript 读取该片段标识符并对其进行了不安全的操作,那么所有的赌注都没有了。但请注意,在这种情况下,您需要解决一个更根本的安全问题。

    仅禁止以# 开头的链接不会起到太大作用,因为攻击者仍然可以在完整的 URL 中包含恶意片段标识符,甚至在从其他地方指向您网站的链接中。

    【讨论】:

    • 攻击者仍然可以在完整的 URL 中包含恶意片段标识符”——这是一个很好的观点
    【解决方案2】:

    这不安全。例如,jQuery 的$(location.hash) 存在 XSS 问题。 http://ma.la/jquery_xss/ 有 PoC。

    所以要么禁止这样做,要么在 # 之后正确清理所有内容

    【讨论】:

    • 当然,即使您不允许在用户内容中允许以# 开头的链接,这样的XSS 漏洞也很容易被利用。如果您容易受到这种攻击,那么您应该真正修复实际的漏洞。 (这里涉及到一个通用的安全原则:永远不要将未经过滤的用户输入传递给 DWIM 函数,如 jQuery 的 $(...) 或 PHP 的 fopen() 等)
    • 有趣! (我同意@IlmariKaronen 的“正确”解决方案是升级/修补 jQuery)
    • 我刚刚意识到你的正则表达式是错误的,因为我可以发布 http://yoursite.com#evil 并且它会通过。所以,无论如何,主播都在游戏中。
    猜你喜欢
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    相关资源
    最近更新 更多