javascript - 在这种情况下 eval() 是邪恶的吗?

标签 javascript security eval

嗨:)我想知道在这种情况下eval是否安全:

!function(){
    var a = 1;
    !function(){
        var b = 2;
        try { eval.call({}, 'a'); } 
        catch (e) { console.log(e.message); }
        try { eval.call({}, 'b'); } 
        catch (e) { console.log(e.message); }
    }();
}();

两次调用均失败。这是否意味着 eval 无法访问周围的作用域?换句话说,使用 eval.call({}, '...') 代替 eval('...'),可以 eval code> 只访问对象的成员?


这里有一些测试:https://stackoverflow.com/a/20975485/1636522 .

最佳答案

如果eval没有“调用上下文”(基本上是this的本地值),那么执行上下文就是全局上下文。 Section 10.4.2 of the spec.

所以这应该有效:

!function(){
    var a = 1;
    function evalWrapper() {
        var b = 2;
        try { eval('a'); console.log("yaay!"); } 
        catch (e) { console.log(e.message); }
    };
    evalWrapper.call({});
}();

规范中描述的第一个场景是:

If there is no calling context or if the eval code is not being evaluated by a direct call (15.1.2.1.1) to the eval function then,
a. Initialise the execution context as if it was a global execution context using the eval code as C as described in 10.4.1.1.

因此,除了直接调用 eval( Something ) 之外,您所做的任何事情 - 包括,如果您阅读了引用的部分,则通过名称“eval”以外的其他内容引用“eval”函数! - 然后在全局上下文中评估字符串中的代码,包括全局词汇上下文。因此,就好像代码根本不在周围的函数内部。

关于javascript - 在这种情况下 eval() 是邪恶的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20974466/

相关文章:

javascript - 如何组合多个 getServerSideProps 包装器?

javascript - jQuery href 导航

linux - www 文件夹内的 .ssh/authorized_keys 文件

在 LightGBM 中使用 eval() 评估测试数据集

perl - Perl 中的这个 eval 语句有什么问题?

javascript - jQuery event.which 在按下 Enter 键时返回 13

javascript - 使用 eval 时不会受到 XSS 威胁

cookies - 当通过 https 连接时,将用户密码存储在 Cookie 中有什么风险?

python - 为什么 eval() 在网络编译器中不起作用?

javascript - 在 knockout 中,使用 attr{.....} 和不使用 attr{.....} 有什么区别?