相关疑难解决方法(0)

使用 ES6 `Proxy` 和 `with` 真的安全吗?

众所周知,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。有什么风险?

以下是我看到的一些担忧:

  1. 不要将任何引用window、或document、或localStorage或任何其他敏感内容放入 中env
  2. 不要放入任何可变对象,env除非您同意不受信任的代码改变它。
    • 解决方案:如有必要,进行深复制。
  3. 块内的代码with无法访问块外的任何内容。如果需要诸如MathObject、 或 之类的东西String,则必须将它们放入env- 这意味着这些可以被恶意代码修改。即使是eval上面我的最小示例中的函数也可以修改。
    • 解决方案:为这些对象创建代理,将对特定属性的只读访问权限列入白名单。

只要遵循这些准则,这真的安全吗?还有其他问题吗?

javascript security eval

6
推荐指数
1
解决办法
862
查看次数

有什么方法可以将函数中的所有变量定义为此属性?

我知道这可能听起来有点荒谬,但我正在寻找一种方法来定义函数中的每个变量作为属性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对象中.

javascript this

1
推荐指数
1
解决办法
236
查看次数

标签 统计

javascript ×2

eval ×1

security ×1

this ×1