允许以#(hash)开头的链接是否安全?

时间:2012-02-03 06:29:19

标签: security url xss google-caja

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

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

无论如何,我问的一个原因是我正在使用Google Caja's html-sanitizer来清理HTML。它会过滤网址: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 ...我不知道的事情)

2 个答案:

答案 0 :(得分:3)

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

所以要么禁止这个,要么在#

之后正确消毒

答案 1 :(得分:3)

应该是安全的:浏览器将网址#之后的任何内容解析为fragment identifier

当然,如果您在页面上有一些JavaScript读取该片段标识符并使​​用它做一些不安全的事情,那么所有的赌注都会关闭。但请注意,在这种情况下,您需要修复一个更基本的安全问题。

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