3

可能重复:
Javascript中算术表达式的安全评估

我正在尝试构建一个在线计算器,作为我一直在开发的网站的一部分。

我有+ - * / ( ) AVG MIN MAX sine cos etc作为操作。有数字、运算符和功能按钮。我只是在按下任何按钮时附加一个字符串。

我必须在 UI 端构建一个基本的语法检查器。服务器将实际执行操作并将它们存储并显示。我不想花太多时间编写客户端代码,但我的想法是验证它在数学上是否有意义。

这是我的计划:

我将尝试eval()生成的字符串并捕获错误。如果错误是 synatxError,则表示该字符串在语法上是错误的。如果是其他类型的错误,我可以接受。

所以我在脚本的开头做了这个:

Error.prototype.dummy_attribute = "notSyntaxError"
SyntaxError.prototype.dummy_attribute = "SyntaxError"

上述方法对我不起作用,因为如果有字符串链接2(),我会收到类型错误。现在我必须编写一个代码来检查空括号和括号前面没有运算符,或者括号后面没有运算符

或者是否有另一种方法可以用来检查字符串的语法,我必须看看它在数学上是否有意义。

4

1 回答 1

1

使用 eval 是可能的。我知道一些顽固的 eval 仇恨者会对此表示反对。唯一不好的方法是让人们在查询字符串中使用等式提供指向您页面的链接。这将使您面临 XSS 攻击。如果您仅在当前页面上使用它进行验证,那么该人只会搞砸自己的页面,对其他人没有风险。

基本思路:

function avg () {
    var len = arguments.length;
    if(len===0) {
        throw "no arguments suppulied for AVG";   
    }
    var arr = Array.prototype.slice.call(arguments, 0);   
    var total = 0;
    for (var i=0; i<len; i++) {
        total += arr[i];
    }
    return total/len;
}
function sine (num) {
    return Math.sin(num);
}

function max () {

    var len = arguments.length;
    if(len===0) {
        throw "no arguments suppulied for MAX";      
    }   
    var arr = Array.prototype.slice.call(arguments, 0);
    return Math.max.apply(null, arr);

}


function isValidEqn (eqn) {
    try{
        eval("var x = " + eqn.toLowerCase());
        return !isNaN(x);
    } catch(e) {
        //console.error(e);
        return false;
    }
}



var eqn1 = "AVG ( 2008 , 2000 )";
var eqn2 = "AVG ( 2008 , 2000 ) / 100 + sine(10)";
var eqn3 = "AVG ( 2008 , 2000 ) / 100 + sine(10) + MAX(10,20)";

console.log("sadjhsahd", isValidEqn("sadjhsahd") );
console.log(eqn1, isValidEqn(eqn1) );
console.log(eqn2, isValidEqn(eqn2) );
console.log(eqn3, isValidEqn(eqn3) );
于 2012-10-18T13:44:53.217 回答