4

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

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

无论如何,我问的一个原因是我正在使用Google Caja 的 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:....' 之类的链接做任何疯狂的事情?好吧,它不会(反正不是我的浏览器),但也许还有其他一些东西。 ..我不知道)

4

2 回答 2

3

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

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

于 2012-02-03T14:49:09.683 回答
3

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

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

仅仅禁止链接而不是开始#不会做太多,因为攻击者仍然可以在完整的 URL 中包含恶意片段标识符,甚至在从其他地方指向您的站点的链接中。

于 2012-02-03T16:23:34.220 回答