javascript - 如何在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);
}
解决方案
eval
通常被认为是不安全的,因为它会以调用者的完全权限在客户端设备上运行它作为输入的任何代码,无论该代码是否是恶意的。
如果字符串eval
运行可能受到恶意第三方的影响,那么这是危险的,因为它将拥有您的用户授予网页的所有权限。
例如,邪恶的用户 X 可能编写了一个脚本,您的应用程序无辜地将该脚本提供给用户 Y 的浏览器,并在其中使用eval
.
但是,在您的情况下,由于您没有将数据从一个用户提供给另一个用户,因此该字符串不可能受到第三方的影响,使用eval
. 看到这个问题. 然而, eval 与替代方案相比效率相对较低Function
。功能虽然仍然不安全,但更安全,但我们已经确定此类漏洞不适用于您的用例。更重要的是(至少根据 MDN 文档)Function
效率更高。只是做:var result = Function("return" + newArr)();
。
您的客户仍然可以编写诸如 之类的愚蠢的东西while(true){console.log("infinite loop")}
,但无论如何他们都可以通过控制台完成此操作,并且不会影响其他任何人。总之,eval
类似的功能经常被盲目地谴责为“不安全”,但这仅在某些情况下是正确的。
推荐阅读
- javascript - FourSquare Axios 请求 - ReactJs - 无法读取未定义的属性“地图”
- excel - Excel VBA 更改网站组合框
- vue.js - VueJS 无法读取未定义的属性“名称”导致 UI 错误
- android-layout - Android recyclerview 项目xml布局
- c++ - 改变 QGraphicPixmapItem 的碰撞区域
- php - Phinx 迁移 sqlite 内存 phpunit
- flask - flasfka 包的无效主题错误
- c++ - 在 C++ STL 中省略更大模板的类型参数
- php - 在 PHP 中使用 CURL 在 Netlify 上创建站点
- deep-learning - 如何使用带有 nvdia 数字 ( caffe ) 的高光谱图像?