具有清理输入的eval()的安全性

时间:2014-02-01 18:21:36

标签: javascript eval sanitization

我想使用eval()来解析简单的方程式和逻辑表达式,例如: 12*(4+3)

当输入(可能不受信任)被消毒并且仅允许数字时,客户端eval的安全性如何,+ - * /()<> |&!和'真'和'假'一词?

方程式的可用JS解析器对我来说太大而且功能强大。我把自己扔了一个,但是与eval'ing相比,它有很多代码,而且它还不完美。

编辑:所以,是的,我猜我特别要求的是,有人可以执行恶意代码而不是数字和+ - * /()<> |&! ? (我猜'真'和'假'是无害的)

1 个答案:

答案 0 :(得分:1)

我认为这是完全安全的,我不认为eval是邪恶的。只要用它来判断, 并仔细检查您的消毒功能。

由于您不允许_$的unicode字母通过清理,并且javascript标识符必须包含字母,因此不可能污染全局范围,而不是调用函数

来自MDN page on identifiers

  

从JavaScript 1.5开始,您可以使用ISO 8859-1或Unicode   标识符中的å和ü等字母。您也可以使用\ uXXXX   Unicode转义序列作为标识符中的字符。

请记住捕获eval次调用引发的异常,因为它总是可能输入错误的表达式,例如4><5

此外,请务必检查您允许的字符,而不是您拒绝的字符,以便默认情况下拒绝您未考虑的字符。