以#(哈希)开头的链接是否安全?

4
我正在构建一个Web应用程序,用户可以动态创建HTML内容。允许他们创建以#开头的链接是否安全(例如,针对XSS攻击)?
我不知道为什么不安全——也许我只是有点多虑。(我的JavaScript代码没有特别处理# URL。)
无论如何,我问这个问题的一个原因是,我正在使用Google Caja's html-sanitizer来消毒HTML。它过滤URL,但是默认过滤器如下:
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:....' 的链接做出任何疯狂的事情吗?好像没有(至少我的浏览器没有),但也许还有其他...某些东西...我不知道)
2个回答

3

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

因此,要么禁止此操作,要么在#后面正确地进行所有内容的消毒处理。


1
当然,即使您不允许用户内容以#开头的链接,像这样的XSS漏洞也很容易被利用。如果您容易受到此类攻击,您应该真正修复实际漏洞。(这里涉及到一个通用的安全原则:永远不要将未经过滤的用户输入传递给DWIM函数,例如jQuery的$(...)或PHP的fopen()等。) - Ilmari Karonen
有趣!(我同意@IlmariKaronen的观点,即“正确”的解决方案是升级/修补jQuery) - KajMagnus
我刚意识到你的正则表达式是错误的,因为我可以发布 http://yoursite.com#evil 并且它会通过。所以,锚点仍然在游戏中。 - p0deje

3

这应该是安全的:URL中 # 后面的任何内容都被浏览器解析为 片段标识符

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

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


“攻击者仍然可以在完整的URL中包含恶意片段标识符” - 这是一个好观点。 - KajMagnus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接