我们最近加入了其他人的代码,这些代码已经过测试,并且在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)
这似乎有效,但我对解决方案并不十分满意.有没有人能提供更好的解决方案或任何有用的见解?
如果您坚持使用正则表达式解决方案,这远非理想,但在给定约束条件下可能是最佳选择:
我不是定义匹配恶意哈希(/(javascript|src|onerror|%|<|>)/g)的正则表达式,而是定义匹配声音哈希的正则表达式(例如/^[\w_-]*$/).
它将避免误报错误(例如src_records),明确授权和不授权,并阻止更复杂的注入机制.