我正在构建一个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 ...我不知道的事情)
答案 0 :(得分:3)
这不安全。例如,jQuery的$(location.hash)
存在XSS问题。在http://ma.la/jquery_xss/处有PoC。
所以要么禁止这个,要么在#
之后正确消毒答案 1 :(得分:3)
应该是安全的:浏览器将网址#
之后的任何内容解析为fragment identifier。
当然,如果您在页面上有一些JavaScript读取该片段标识符并使用它做一些不安全的事情,那么所有的赌注都会关闭。但请注意,在这种情况下,您需要修复一个更基本的安全问题。
仅仅禁止使用#
开头的链接不会做太多,因为攻击者仍然可以在完整的URL中包含恶意片段标识符,甚至可以在从其他位置指向您网站的链接中包含。