我们最近加入了其他人的代码,这些代码已经过测试,但是对于DOM XSS攻击失败了。 基本上,url片段被直接传递到jQuery选择器并启用JavaScript,如下所示:
"http://website.com/#%3Cimg%20src=x%20onerror=alert%28/XSSed/%29%3E)"
$(".selector [thing="+window.location.hash.substr(1)+"]");
问题是这是在整个脚本中发生的,并且需要进行大量的回归测试来修复,例如如果我们转义数据if if语句将不再返回true,因为数据不匹配。
有问题的JavaScript文件在构建时与许多较小的文件连接在一起,因此修复起来更加困难。
有没有办法用一些全局代码来防止这些DOM XSS攻击,而无需经历和调试每个实例。
我建议在脚本的顶部添加一个小的正则表达式来检测XSS攻击中使用的常见字符,如果它返回true则简单地终止它。
var xss = window.location.href.match(/(javascript|src|onerror|%|<|>)/g);
if(xss != null) return;
这似乎有效但我对解决方案并不十分满意。有没有人能提供更好的解决方案或任何有用的见解?
答案 0 :(得分:6)
如果您坚持使用正则表达式解决方案,这个解决方案远非理想,但鉴于您的约束条件,它可能是最佳选择:
我不是定义匹配恶意散列(/(javascript|src|onerror|%|<|>)/g
)的正则表达式,而是定义匹配声音散列的正则表达式(例如/^[\w_-]*$/
)。
它将避免误报错误(例如src_records
),明确授权和不授权,并阻止更复杂的注入机制。
答案 1 :(得分:0)
您的问题是由于jQuery的输入字符串可能被视为HTML,而不仅仅是选择器。
使用原生document.querySelector()
代替jQuery。
如果对IE7的支持对您很重要,您可以尝试使用Sizzle选择器引擎,这可能与jQuery不同,类似于本机querySelector()
,不会将输入字符串解释为与选择器不同的内容。