我开发了一个JavaScript模块来防止客户端基本的基于dom的XSS。我使用了几个标准函数:indexOf(),substring(),toString()等。 在测试期间,我发现一些外部JavaScript库有时会错误地覆盖函数。例如,如果数组中不存在元素,则the following overriding of indexOf() function不返回-1:
; /* Start:/js/jquery.select.js*/
(function($){
//add class of js to html tag
$('html').addClass('js');
//create cross-browser indexOf
Array.prototype.indexOf = function (obj, start) {
for (var i = (start || 0); i < this.length; i++) {
if (this[i] == obj) {
return i;
}
}
}
因此,这个新的indexOf()
可能会中断ifStatement
。简单的例子:
function protect(s){
...
if(sNodes.indexOf(node) !== -1) { {
/*injection found*/
sanitize(s);
...
}
}
如果节点不存在,indexOf()
现在返回undefined
。在我的情况下,这可能导致正确的输入数据的误报和消毒。
必须在DOMContentLoaded之前和之后执行该脚本。
一个注意事项:我无法控制我所在的环境。脚本将用于消毒。它有点像WAF,可以使用任何JavaScript应用程序
我的建议如下:
Array.prototype._indexOf = Array.prototype._indexOf;
...
function sanitize(s){
...
if(sNodes.indexOf(node) !== -1) { {
/*injection found*/
sanitize(s);
...
}
}
他们是对的吗? 处理此问题的最佳做法是什么?
答案 0 :(得分:1)
我的建议是否正确?
是。对于解决方案2,您可能希望使用indexOf.call(sNodes, node)
然后使用Function.prototype.call
(如果您相信<style name="MyTheme" parent="@style/MyCustomTheme">
<item name="android:textSelectHandle">@drawable/text_select_handle_middle</item>
<item name="android:textSelectHandleLeft">@drawable/text_select_handle_left</item>
<item name="android:textSelectHandleRight">@drawable/text_select_handle_right</item>
</style>
没有被混淆...),以避免在内置原型上创建方法。当然,您需要确保在恶意库之前加载库。
处理此问题的最佳做法是什么?
忽略此问题。按照您的要求编写代码。
如果你找到另一个做这种狗屎的库,a)提交一个bug,b)用一个更好的替换它。如果有人坚持使用这样的图书馆,请额外收费。
如果您的实际目标是完全阻止此类问题,请使用Caja。