Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中算术表达式的安全评估_Javascript_Parsing_Math - Fatal编程技术网

Javascript中算术表达式的安全评估

Javascript中算术表达式的安全评估,javascript,parsing,math,Javascript,Parsing,Math,我需要在Javascript中评估用户输入的算术表达式,如“2*(3+4)”,但出于安全原因,我不想使用eval 我可以去掉所有不是数字或运算符的字符,但我不确定这是否安全,如果用户可以使用诸如cos、sqrt等函数,那就太好了 有没有进行算术表达式求值的Javascript库?您可以使用正则表达式替换除白名单之外的所有内容。但是由于javascript是在客户机上执行的(除非您运行的是AOL http服务器),任何可以修改输入的人都可以修改代码——因此您并没有真正让它变得比现在更安全 您可以尝

我需要在Javascript中评估用户输入的算术表达式,如“2*(3+4)”,但出于安全原因,我不想使用
eval

我可以去掉所有不是数字或运算符的字符,但我不确定这是否安全,如果用户可以使用诸如
cos
sqrt
等函数,那就太好了


有没有进行算术表达式求值的Javascript库?

您可以使用正则表达式替换除白名单之外的所有内容。但是由于javascript是在客户机上执行的(除非您运行的是AOL http服务器),任何可以修改输入的人都可以修改代码——因此您并没有真正让它变得比现在更安全

您可以尝试:

此库是的修改版本 拉斐尔·格拉夫的动作脚本表达 解析器。当我写JavaScript的时候 功能绘图仪,我想要一个更好的 使用JavaScript的eval的替代方法 功能。没有安全风险 目前,因为您只能运行 在您自己的浏览器中编写代码,但它不是 方便数学(math.pow(2^x) 而不是2^x等)

那么您的代码将如下所示:

console.info ( Parser.evaluate( "2 * (3 + 4)" ) ); //prints 14

如前所述,任何用户所能造成的最大损害几乎就是他们在任何主要浏览器中使用内置控制台所能造成的损害。但是,如果您想限制用户使用
Math
properties/methods,您可以编写一个简单的正则表达式来处理这个问题。像这样的方法应该会奏效:

function mathEval (exp) {
    var reg = /(?:[a-z$_][a-z0-9$_]*)|(?:[;={}\[\]"'!&<>^\\?:])/ig,
        valid = true;
       
    // Detect valid JS identifier names and replace them
    exp = exp.replace(reg, function ($0) {
        // If the name is a direct member of Math, allow
        if (Math.hasOwnProperty($0))
            return "Math."+$0;
        // Otherwise the expression is invalid
        else
            valid = false;
    });
    
    // Don't eval if our replace function flagged as invalid
    if (!valid)
        alert("Invalid arithmetic expression");
    else
        try { alert(eval(exp)); } catch (e) { alert("Invalid arithmetic expression"); };
}

将它添加到
if
else
语句()之间。

您可以使用math.js中的高级表达式解析器,它不使用JavaScript的eval

用法:

var ans = math.evaluate('2 * (3 + 4)');
或者使用解析器(支持变量和函数赋值):

试一试

var result=nerdamer('sqrt(4)+cos(1)-2')。evaluate();
document.getElementById('text').innerHTML=result.text()


除非您自己动手,否则无法克服任何安全问题?谢谢!这正是我想要的,我发誓我在谷歌上搜索了我能找到的“表达式求值”的所有可能变体…“任何用户能做的最大伤害几乎就是他们在任何主要浏览器中使用内置控制台所能做的事”是基于错误的前提。字符串通过服务器和URL来自浏览器外部。最好的策略是编写代码,假设函数的输入将来自其他开发人员添加到应用程序中时您不期望的地方,这意味着不要使用像
eval
这样功能强大的运算符@Mike:我很难100%同意。虽然您在评估来自其他来源的输入时所说的是正确的,但当您仅评估用户输入时,我支持我的答案。@AndyE,我对短语“评估用户输入”的理解包括在用户Alice的浏览器中评估用户Carol的输入。在每个PM和他们的母亲试图使他们的网站“社会化”之前,更有限的阅读是合理的,但今天我认为更广泛的阅读应该是默认的,除非应用程序规范特别说明。用例可以包括在服务器端评估用户输入。那么安全性就很重要了。它取决于键入要计算的表达式的用户是否与计算该表达式的用户相同。
var ans = math.evaluate('2 * (3 + 4)');
var parser = math.parser();
var ans = parser.evaluate('2 * (3 + 4)');