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