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

use*_*878 9 javascript sanitization eval

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

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

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

编辑:所以是的,我想我特别要问的是,有人可以执行除了数字和+ - */()<> |&!之外的任何恶意代码.?(我猜'真''和'假'是无害的)

And*_*odi 2

我认为这是完全安全的,我不认为那eval是邪恶的。只需谨慎使用它,\n并仔细检查您的清理功能。

\n\n

由于您既不允许 unicode 字母_$不允许通过清理,并且 javascript 标识符必须包含字母,所以不可能污染全局范围,也不可能调用函数。

\n\n

来自MDN 标识符页面

\n\n
\n

从 JavaScript 1.5 开始,您可以在标识符中使用 ISO 8859-1 或 Unicode\n 字母,例如 \xc3\xa5 和 \xc3\xbc。您还可以使用 \\uXXXX\n Unicode 转义序列作为标识符中的字符。

\n
\n\n

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

\n\n

另外,请确保检查您允许的字符,而不是检查您拒绝的字符,以便默认情况下会拒绝您没有考虑到的字符。

\n