众所周知,Javascript 的eval关键字和Function从字符串创建的对象都不应出于任何原因用于运行不受信任的代码。
然而,我想知道 ES6 代理是否会改变这一点。考虑:
let env = {eval: eval};
let proxy = new Proxy(env, { has: () => true });
with(proxy) {eval('...')}
Run Code Online (Sandbox Code Playgroud)
代理对象假装拥有所有可能的属性,这意味着它会阻止更高范围的搜索。在该with块内,任何未在 上设置的属性env都会出现undefined,而在 with 块内设置的任何全局属性实际上都会在 上设置env。
这似乎让我可以为ed代码运行建立一个完全受控和隔离的环境eval。有什么风险?
以下是我看到的一些担忧:
window、或document、或localStorage或任何其他敏感内容放入 中env。env除非您同意不受信任的代码改变它。
with无法访问块外的任何内容。如果需要诸如Math、Object、 或 之类的东西String,则必须将它们放入env- 这意味着这些可以被恶意代码修改。即使是eval上面我的最小示例中的函数也可以修改。
只要遵循这些准则,这真的安全吗?还有其他问题吗?
我知道这可能听起来有点荒谬,但我正在寻找一种方法来定义函数中的每个变量作为属性this.我正在寻找任何方法,以任何方式能够有一些方法来跟踪函数内的变量(即将它们添加到this对象),而不必实际为每个变量定义添加前缀this..有办法吗?这有可能Proxy吗?
function () {
// declare a variable
var hello = 'hi'
return this
}
let {hello} = function()
console.log(hello) // hi
Run Code Online (Sandbox Code Playgroud)
例如,这有效:
function hi () { this.hello = true; return this }
hi.bind({})() // { hello: true }
Run Code Online (Sandbox Code Playgroud)
我想要的是一种方法,在定义所有变量时hi将其添加到this对象中.