我可以限制一个字符串生成功能(使用功能的构造函数)父/全球范围的访问?
例如:下面的代码,因为它是,打印假的 ,因为该函数是存储/在窗口修改变量a。
window.a = 4;
Function("a=3;")()
console.log(a === 4);
我能限制访问窗口/父范围,并使其打印出“真”?
我可以限制一个字符串生成功能(使用功能的构造函数)父/全球范围的访问?
例如:下面的代码,因为它是,打印假的 ,因为该函数是存储/在窗口修改变量a。
window.a = 4;
Function("a=3;")()
console.log(a === 4);
我能限制访问窗口/父范围,并使其打印出“真”?
下面是这可能是非常强大与Esailija的建议(请参阅讨论他的回答评论)一起额外的想法。
你可以创建虚拟iframe和使用它的Function
函数。 与创建该功能只在默认情况下访问iframe的范围,但它仍然可以打破它。 幸运的是很容易预防,通过Esailija建议的方式。
我能想象的功能是这样的:
function sandboxed(code) {
var frame = document.createElement('iframe');
document.body.appendChild(frame);
var F = frame.contentWindow.Function,
args = Object.keys(frame.contentWindow).join();
document.body.removeChild(frame);
return F(args, code)();
}
DEMO
可选您可能要在前面加上'use strict';
该代码。
此作品至少在Chrome中。 无论是创建这样的函数可以访问iframe的全局范围或页面的全局范围可以很容易地进行测试:
(function() {
var frame = document.createElement('iframe');
document.body.appendChild(frame);
var same = window === frame.contentWindow.Function('return window;')();
alert(same ? ':(' : ':)');
document.body.removeChild(frame);
}());
我不认为如此。 你能说出你想要保护的参数,使它们的影子他们的全局:
window.a = 4;
Function("a", "a=3;")()
console.log(a === 4);
但功能将有机会获得全球不管你是什么......这就是为什么它被称为全球。
根据什么你正在尝试做的,也有其他变通方法,如网络工作者......和往常一样, 隐藏的iframe黑客 。
@ Esailija的答案是正确的。 此外,我会建议限制你必须摆在首位,以保护全局变量的数量。 放任何东西,你通常会放在在全局命名空间APP
,你控制范围:
var APP = (function() {
return {
a: 4
};
}());
有没有办法完全限制访问全球范围内,但至少这种方式,你只需要保护一个对象: APP
。