在 Javascript 中围绕 Function() 创建沙箱
Make sandbox around Function() in Javascript
我可以限制字符串生成的函数(使用函数构造函数)对父/全局范围的访问吗?
例如:下面的代码按原样打印 false,因为该函数正在窗口中存储/修改变量 a。
window.a = 4;
Function("a=3;")()
console.log(a === 4);
我可以限制对窗口/父范围的访问并使其打印出"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)();
}
演示
(可选)您可能希望在代码前面附加'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
.
这是我改编的sandboxed
函数。它接受代码和带有函数参数的可选字典。
function sandboxed(code, args = {}) {
var frame = document.createElement('iframe');
document.body.appendChild(frame);
var F = frame.contentWindow.Function;
document.body.removeChild(frame);
return F(...Object.keys(args), "'use strict';" + code)(...Object.values(args));
}
console.log(sandboxed('return a - 10;', {'a': 34}));
// 24
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 为effect Composer创建GodRays效果过程
- 从javascript创建一个列表
- onkeyup无法动态创建多个文本区域
- 如何使用javascript从主svg对象动态创建svg视图框
- 如何访问声音管理器2创建的声音对象
- 我已经创建了一个jquery转盘,并使用if条件来运行和停止转盘
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 如何在JavaScript中创建类似于something.function()的函数
- 创建一个类,该类使用es6类语法将Function对象创建为实例
- 在 Javascript 中围绕 Function() 创建沙箱
- 如何在jquery中创建函数和parent.function
- 向使用javascript中的new function关键字创建的函数传递参数
- 正在使用var foo = function foo() {};在IE中创建内存泄漏的表达式<9.
- 使用new Function()和string创建SAPUI5控件
- 使用Function创建变量
- 为什么在v8::Scope之前创建新的v8::Array会导致分割错误,而v8::String和v8::Function
- 使用function和“new”的设计意图是什么?关键字在Javascript中创建对象
- 是所有的函数声明&在幕后调用new Function()创建的表达式
- 如何在不修改全局Function.prototype的情况下创建函数的继承属性?