首页 > 解决方案 > 如何在java脚本中评估字符串数学表达式?

问题描述

请建议 eval() 的替代方法,因为它显然是“不安全的”。也希望能解释一下原因。我将此代码用于我的计算器应用程序,它可以工作,但我想对其进行优化。

if (e.target.innerHTML === "="  ){

    newArr=arr.join(' ');
    var result =eval(newArr);
    pnode.innerHTML = result;
    
}

else
{

    pnode.innerHTML = e.target.innerHTML;
    arr.push(e.target.innerHTML);
    console.log(arr);

}

标签: javascripthtmlcssecmascript-6vanilla-forums

解决方案


eval通常被认为是不安全的,因为它会以调用者的完全权限在客户端设备上运行它作为输入的任何代码,无论该代码是否是恶意的。
如果字符串eval运行可能受到恶意第三方的影响,那么这是危险的,因为它将拥有您的用户授予网页的所有权限。
例如,邪恶的用户 X 可能编写了一个脚本,您的应用程序无辜地将该脚本提供给用户 Y 的浏览器,并在其中使用eval.

但是,在您的情况下,由于您没有将数据从一个用户提供给另一个用户,因此该字符串不可能受到第三方的影响,使用eval. 看到这个问题. 然而, eval 与替代方案相比效率相对较低Function。功能虽然仍然不安全,但更安全,但我们已经确定此类漏洞不适用于您的用例。更重要的是(至少根据 MDN 文档)Function效率更高。只是做:var result = Function("return" + newArr)();

您的客户仍然可以编写诸如 之类的愚蠢的东西while(true){console.log("infinite loop")},但无论如何他们都可以通过控制台完成此操作,并且不会影响其他任何人。总之,eval类似的功能经常被盲目地谴责为“不安全”,但这仅在某些情况下是正确的。


推荐阅读