我正在重新审视这个我曾经处理过的旧项目,我希望避免使用if语句和切换块来渲染一个简单的计算,其中运算符(+
/ -
/ {{ 1}} / /
)可以是任何东西。
我正在通过ajax从数据库(安全插入)中检索数据,以及用户输入的beta情况(再次通过验证精心确保)。这很好,但是很好。现在我们来到我听过这么多的恶魔。 *
。
如果您花时间阅读,使用V8引擎之类的现代浏览器可以缓存已编译的eval。人们说它会通过注射产生脆弱性。如果您提供有效的验证并避免任何关键应用程序错误结构,那么它如何有害?
eval()
这还不安全吗?它比switch语句更有效吗?嵌套的if语句?如果性能不是问题,并且您确实知道自己在做什么,那么//note I'm using var just for clarity, this is NOT the declaration or assignment statment
//also note the variables are stored in an array because the condition can be dynamic in size, but that's overhead for now
var firstNum = 50;
var secondNum = 100;
var operator = "+";
var condition = firstNum+operator+secondNum;
if (eval(condition) > 149) { //not the real condition, just an example
console.log("Success");
}
可以是好的,而不是......等待它...... eval()
?
注意:是的,我已经看到了关于evil()
的其他问题,但我仍然没有找到这个甚至存在的理由,因为人们把它视为麻风病人。
这基本上归结为:处理数学运算符不是静态值的条件的最佳方法是什么?
答案 0 :(得分:9)
eval
部分是有害的,因为
在这种情况下,您可以执行类似
的操作var operators = {
'+' : function(a, b) { return a + b; },
'-' : function(a, b) { return a - b; },
'*' : function(a, b) { return a * b; },
'/' : function(a, b) { return a / b; },
};
var firstNum = 50;
var secondNum = 100;
var op = operators['+'];
if (op(firstNum, secondNum) > 149) {
console.log('Success');
}
并最终获得您正在寻找的所有动态eval
,没有任何缺点。您可以准确定义要允许的操作,更重要的是,您甚至不限于中缀运算符 - 例如,您可以使用'max'运算符或'round'。