gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:39:06 27 4
gpt4 key购买 nike

我开发了一个 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);
    ...
    }
    }

它们正确吗?处理这个问题的最佳实践是什么?

最佳答案

Are my suggestions correct?

是的。对于解决方案 2,您可能需要使用 var indexOf = Array.prototype.indexOf,然后使用 indexOf.call(sNodes, node)(如果您信任该 Function .prototype.call 没有被搞乱...)以避免在内置原型(prototype)上创建方法。当然,您需要确保您的库在恶意库之前加载。

What are the best practices to deal with this issue?

忽略这个问题。像往常一样编写代码。

如果你发现另一个库做了这样的事情,a)向他们提交一个错误,b)用更好的库替换它。如果有人坚持使用这样的库,请向他们收取额外费用。

如果您的实际目标是完全防止此类问题,请使用 Caja .

关于javascript - 如何处理 JavaScript 中标准函数的错误覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35487192/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com