【问题标题】:Is this safe? eval or new Function for simple arithmetic expression这安全吗?用于简单算术表达式的 eval 或 new 函数
【发布时间】:2012-09-27 18:05:15
【问题描述】:

我听说过很多关于 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?
  • 还有其他更安全的方法来评估公式吗?

【问题讨论】:

    标签: javascript regex eval


    【解决方案1】:

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

    【讨论】:

    • +1 我同意...eval 在服务器端语言(如 PHP)中更危险。在客户端语言(如 Javascript)上没什么大不了的。
    • 我在演示中使用了输入字段,但正如我在问题中所说,值和公式实际上来自外部来源。我担心恶意来源可能会推送不安全的公式(脚本标签或 onload 事件或其他我无法想象的东西)
    • @Travesty3 eval 在客户端也可能很危险并用于跨站点脚本。 en.wikipedia.org/wiki/Cross_site_scripting 然而,在这个例子中它是完全安全的,我同意。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我不担心用户伤害自己,而是担心受到外部来源的伤害(参见我的问题和我对@Kolink 答案的评论)。转义特殊字符听起来是个好主意,但问题是它会破坏我的验证表达式(大于、小于)。
    • 确实如此。因此,您可能必须制定您的自定义正则表达式并彻底测试它们。
    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多