我想创建一个 HTML+JS 环境,用户可以在其中输入和运行任意 JavaScript 代码,这些代码将在给定的 jail 对象的上下文中执行。我已经建立了一个游乐场来说明我到目前为止所拥有的。
这个做得不错:
- 基本评价工作:
- 输入:
2 + 2
- 输出:
4
- 输入:
this
返回监狱对象- 输入:
this
- 输出:
[object Object]
- 输入:
this.hello()
运行预期的方法- 输入:
this.hello()
- 输出:
hello world!
- 输入:
- 用户可以设置自己的功能并在以后执行它们:
- 输入:
this.foo = function() { return 42; }
- 输出:
function () { return 42; }
- 输入:
this.foo()
- 输出:
42
- 输入:
- 尝试访问一些我想从监狱上下文中“隐藏”的对象失败:
- 输入:
hidden
- 输出:
ReferenceError: hidden is not defined
- 输入:
但是,它完全无法隐藏全局可访问的属性,例如window
or document
for user:
- 输入:
window
- 电流输出:
[object Window]
- 期望的输出:
ReferenceError: window is not defined
到目前为止,我想出的最佳解决方案是在 Jail 对象声明中填充我能想到的所有全局变量,如undefined
更新版本所示。这样他们似乎永远在监狱范围内丢失,用户将无法访问它们。我的问题:null
- 我对吗?这足够安全吗?
- 有没有更好的方法,即在特定范围内真正取消定义全局内容,而不是用一些占位符值重写它们?