防止DOM XSS

sid*_*son 8 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)+"]");
Run Code Online (Sandbox Code Playgroud)

问题是这是在他们的脚本中发生的,并且需要大量的回归测试来修复,例如,如果我们转义数据,如果语句将不再返回true,因为数据将不匹配.

有问题的JavaScript文件在构建时从许多较小的文件连接起来,因此修复起来更加困难.

有没有办法用一些全局代码来防止这些DOM XSS攻击,而无需经历和调试每个实例.


我建议在脚本的顶部添加一个小的正则表达式来检测XSS攻击中使用的常见字符,如果它返回true则简单地终止它.

 var xss = window.location.href.match(/(javascript|src|onerror|%|<|>)/g);

if(xss != null) return;
Run Code Online (Sandbox Code Playgroud)

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

Jul*_*yer 6

如果您坚持使用正则表达式解决方案,这远非理想,但在给定约束条件下可能是最佳选择:

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

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

  • 如此真实.将其设为白名单而不是黑名单! (2认同)