FRD*_*FRD 9 javascript scope sandbox
我可以将字符串生成的函数(使用Function构造函数)的访问权限限制为父/全局范围吗?
例如:以下代码按原样打印为false,因为该函数正在窗口中存储/修改变量a.
window.a = 4;
Function("a=3;")()
console.log(a === 4);
Run Code Online (Sandbox Code Playgroud)
我可以限制对窗口/父作用域的访问并使其打印为"true"吗?
这是一个额外的想法,可以与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)();
}
Run Code Online (Sandbox Code Playgroud)
您可以选择预先'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);
}());
Run Code Online (Sandbox Code Playgroud)
我不这么认为.您可以在参数中命名要保护的全局变量,以便它们遮蔽它们:
window.a = 4;
Function("a", "a=3;")()
console.log(a === 4);
Run Code Online (Sandbox Code Playgroud)
但无论你尝试什么,这个功能都可以访问全球......这就是为什么它被称为全局.
根据您要做的事情,还有其他解决方法,例如网络工作者......以及一如既往地隐藏的iframe黑客攻击.