如何处理JavaScript中标准函数的错误覆盖?

时间:2016-02-18 16:34:09

标签: javascript prototype

我开发了一个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应用程序

我的建议如下:

  1. 实施主要关键功能的自有版本(例如indexOf
  2. 在覆盖这些函数之前保存对这些函数的引用并使用它们: Array.prototype._indexOf = Array.prototype._indexOf; ... function sanitize(s){ ... if(sNodes.indexOf(node) !== -1) { { /*injection found*/ sanitize(s); ... } }
  3. 他们是对的吗? 处理此问题的最佳做法是什么?

1 个答案:

答案 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