Javascript - 在包含数学运算的安全字符串上使用eval发出问题

时间:2013-08-27 12:18:47

标签: javascript

我在使用eval执行此安全操作时遇到了一些问题。

var s = "(4.4 / 2.2) * 4567";
alert(eval(s)); // gives 9134

var t = "(4.4 / 2.2) * 04567";
alert(eval(t)); //gives 4846

有人可以向我解释为什么在变量t上附加到4567的0会导致答案为4846。

2 个答案:

答案 0 :(得分:1)

Javascript将以零开头的数字解释为八进制。因此,基数8中的04567在基数10中为2423。

您可以尝试使用正则表达式删除零或外部库来解析表达式。

这将是一种方式,例如:

var expression = "(4.4 / 2.2) * 04567".replace(/\d+/g, function(val){
     return parseInt(val, 10)
});
alert(eval(expression));

代码用基本10版本替换所有数字。请注意,需要修改解决方案以适用于小数或负数。

答案 1 :(得分:0)

在Javascript中,数字前缀为0被视为八进制。

  

以下是八进制数的例子:
   01234,-077 0312
  正八进制数必须以0(零)开头,后跟八进制数字   负八进制数必须以-0开头,后跟八进制数字。

你可以克服使用

var t = "(4.4 / 2.2) * Number(04567)";