1

我听说过很多关于 eval 的坏事,我什至从未尝试过使用它。但是今天我遇到了一种情况,它似乎是正确的答案。

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

我用一些示例代码设置了一个 jsfiddle 演示:

http://jsfiddle.net/6yzgA/

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

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

我的问题:

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

2 回答 2

3

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

于 2012-09-27T18:08:02.123 回答
0

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

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

如果用户想输入<script>haxx(l33t);</script>- 让他输入。只需记住转义特殊字符,这样您就可以拥有&lt;script&gt;haxx(l33t);&lt;/script&gt;.

于 2012-09-27T18:26:07.733 回答