在Ruby中解释用户输入的表达式(安全地)

时间:2011-02-10 21:58:26

标签: ruby-on-rails ruby

我正在创建一个Rails应用程序,该应用程序具有针对多个客户端的电子商务元素 - 我希望这些客户能够在管理区域中指定用于计算其运送量的公式;这些方法可能有所不同。

让我假装我允许他们输入ruby代码,然后我(稍后计算订单的运费)评估结果 - 它会相当灵活,因为,如果我设置事先确定一些适当的变量,它们可以输入不同的公式,例如:

  • 5.00 #静态金额 - 始终收取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为国内

......当然,这些主题有一百种变化。

现在,问题在于将他们的代码评估为ruby将是一个安全噩梦,允许他们向系统外壳,访问我的数据库,并且通常会造成严重破坏,无论是偶然还是设计。根据我的理解,$ SAFE似乎并不是对安全的保证。

所以,我的实际问题(是的,我确实有一个,最终!)是:是否有一种简单,安全的脚本语言,我可以让用户输入表达式(使用我预先播种的变量),然后计算表达式的结果,但不允许系统调用,数据库访问等?

我必须能够从ruby中解释和运行语言,但语言本身并不一定是ruby - 它几乎可以是任何东西,尽管我更喜欢它对客户来说相当可读,并且能够处理我在上面的ruby示例中使用的那种表达式。布朗尼指出,当我们输入表达式时,我能够对表达式进行语法检查,以向客户指出任何明显的错误。

(当然,除非你能指出我如何在红宝石中做一个“安全”的沙盒评估,这也符合要求。)

2 个答案:

答案 0 :(得分:1)

为了输入任意值,我建议看一下像Liquid Templates或Radiant Tags这样的东西 - 你可以建立自己的模板语言来隔离解释的代码。

另一种方法是使用JavaScript(或Cof​​feeScript)并与JS解释器集成 - 有许多工具可以将Ruby连接到各种JS VM。

那就是说,我认为通过一些智能UI来处理这个问题可能更容易,而不是让用户输入方程式。选择几个最可能的运输选项,并构建一组用于输入值的小部件,然后可以简单地将其验证为整数。

您可以使用此方法实际处理每个示例

  • 始终充电:$ X
  • 订单价值的X%
  • 总数的X%,或$ Y,以较大者为准

安全,从用户体验的角度来看可能是一种更友好的方法。

答案 1 :(得分:0)

  

是否有一种简单,安全的脚本语言,我可以使用它来允许用户输入表达式

Lua一直都是这样的。