这样安全吗?用于简单算术表达式的eval或new函数

时间:2012-09-27 18:05:16

标签: javascript regex eval

我听过很多关于eval的坏事,我从来没有尝试过使用它。但是今天我的情况似乎是正确的答案。

我需要一个可以通过组合变量进行简单计算的脚本。例如,如果value = 5且max = 8,我想评估值* 100 / max。将从外部源检索值和公式,这就是我关注eval的原因。

我已经设置了一个带有一些示例代码的jsfiddle演示:

http://jsfiddle.net/6yzgA/

使用parseFloat将值转换为数字,所以我相信我在这里非常安全。公式中的字符再次匹配此正则表达式:

regex=/[^0-9\.+-\/*<>!=&()]/, // allows numbers (including decimal), operations, comparison

我的问题:

  • 我的正则表达式过滤器可以保护我免受任何攻击吗?
  • 在这种情况下,有没有理由使用eval与new Function?
  • 还有另一种更安全的评估公式的方法吗?

2 个答案:

答案 0 :(得分:3)

由于您没有向服务器发送任何内容或在任何其他人的系统上使用任何内容,因此最糟糕的情况是用户崩溃了自己的浏览器,仅此而已。这里使用eval并不安全,因为一切都发生在用户端。

答案 1 :(得分:0)

逃避和阻止客户端的任何事情都没有意义。用户可以更改任何JS代码并运行它就像我可以更改您发布的jsfiddle一样简单。相信我,就是这么简单,你不能依赖客户端的安全性。

如果您记得在服务器端转义输入字段,则无需担心。默认情况下,有很多功能,具体取决于您使用的语言。

如果用户想要输入<script>haxx(l33t);</script> - 让他这样做。只记得逃避特殊字符,这样你就可以&lt;script&gt;haxx(l33t);&lt;/script&gt;