假设我有以下代码:
var secrets;
Array = function() {
secrets = this;
};
上述示例的作者说代码正在重新定义 Array 构造函数。首先,我不确定this
指的是什么。有人可以请教吗?
第二:下面的代码是等价的吗?
var secrets;
function Array() {
secrets = this;
}
顺便说一下,上面的代码取自以下关于 Json 漏洞的文章:见这里
假设我有以下代码:
var secrets;
Array = function() {
secrets = this;
};
上述示例的作者说代码正在重新定义 Array 构造函数。首先,我不确定this
指的是什么。有人可以请教吗?
第二:下面的代码是等价的吗?
var secrets;
function Array() {
secrets = this;
}
顺便说一下,上面的代码取自以下关于 Json 漏洞的文章:见这里
在这两个示例中,您都将变量定义Array
为function
分配this
给secrets
. 碰巧已经存在一个全局对象,称为Array
页面中的其他 JS 可能会或可能不会用作Constructor
创建数组。如果您弹出控制台并将 Array 重新分配为其他内容,您可能会开始从显式依赖Array
. 但是,字面上用 with 制作的数组[]
仍然可以正常工作,事实上,它们__proto__
仍然指向Array.prototype
. 所以:
var arr1 = new Array('a','b','c');
// arr[0] -> 'a'
var arr2 = ['d','e','f'];
// arr[0] -> 'd'
var secrets;
Array = function() { secrets = this; };
var arr3 = new Array('g','h','i'); // nothing wrong here, because Array is a function
// arr3[0] -> undefined
// Array is just a function, you can't make arrays with new Array anymore
// and arr3 is just a function
var arr4 = ['j','k','l'];
// arr4[0] -> 'j'
// making array literals still works
至于this
,没什么奇怪的,还是遵循着的规则this
。您分配函数的事实Array
不会改变this
行为方式。所以this
指向浏览器中的全局对象,window
除非您实例化new
或使用call
或apply
两个示例之间的区别在于函数表达式和函数声明之间的区别,请参阅:Javascript 中函数表达式与声明之间的区别是什么?
是的,两个片段是等效的。两者都重新定义了数组构造函数,以试图拦截注入它的网站使用的所有数组数据,如链接文章中所述。的值this
应该是新构造的数组。
这似乎是 ECMAScript 3 允许的,但 ECMAScript 5 不允许,现在所有现代浏览器都可以使用。所以文章中描述的漏洞应该不再起作用。