我正在创建一个Rails应用程序,该应用程序有多个客户端的电子商务元素 - 我希望这些客户端能够在管理区域中指定计算其运费的公式;因为这些方法可能不同。在Ruby中解释用户输入的表达式(安全地)
让我们暂时假装我允许他们输入红宝石代码,然后我在稍后(在计算订单运送时)评估结果 - 它会相当灵活,如果我建立一些适当的变量预先,可以输入不同的公式,如:
- 5.00 #A静态量 - 总是充5.00
- order.total * 0.1 #10的顺序值的%
- [order.total * 0.1,3.00] .max #总量的10%,或3.00,取较大
- order.shipping_abroad? ? 10.00:5.00 #为海外客户10.00,5.00,为国内
...当然,百个变化就这些主题。
现在,问题是将代码评估为红宝石将是一个安全的噩梦,允许他们掏空系统,访问我的数据库,并且通常会造成严重破坏,无论是意外还是设计。根据我的理解,$ SAFE似乎不是安全的保证。所以,我的实际问题(是的,我确实有一个,最终!)是:是否有一个简单,安全的脚本语言,我可以允许用户输入表达式(使用我预先设定的变量),然后计算表达式的结果,但不允许系统调用,数据库访问等?
我必须能够在ruby中解释和运行语言,但语言本身并不一定是红宝石 - 它可以是任何东西,但我更喜欢它对客户来说是相当可读的,并且能够应付我在上面的ruby示例中使用的那种表达式。布朗尼指出,如果我有能力在输入表达式时对表达式进行语法检查,以便向客户端指出任何明显的错误。
(除非,当然,你可以点我如何做一个“安全的”,沙盒在红宝石的eval,这将符合要求以及方向。)
或重新定义任何东西! – OscarRyz 2011-02-10 22:37:45