防止DOM XSS

时间:2012-11-08 10:57:32

标签: javascript xss

我们最近加入了其他人的代码,这些代码已经过测试,但是对于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;

这似乎有效但我对解决方案并不十分满意。有没有人能提供更好的解决方案或任何有用的见解?

2 个答案:

答案 0 :(得分:6)

如果您坚持使用正则表达式解决方案,这个解决方案远非理想,但鉴于您的约束条件,它可能是最佳选择:

我不是定义匹配恶意散列(/(javascript|src|onerror|%|<|>)/g)的正则表达式,而是定义匹配声音散列的正则表达式(例如/^[\w_-]*$/)。

它将避免误报错误(例如src_records),明确授权和不授权,并阻止更复杂的注入机制。

答案 1 :(得分:0)

您的问题是由于jQuery的输入字符串可能被视为HTML,而不仅仅是选择器。

使用原生document.querySelector()代替jQuery。

如果对IE7的支持对您很重要,您可以尝试使用Sizzle选择器引擎,这可能与jQuery不同,类似于本机querySelector(),不会将输入字符串解释为与选择器不同的内容。