2011-02-10 96 views
2

我正在创建一个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,这将符合要求以及方向。)

+0

或重新定义任何东西! – OscarRyz 2011-02-10 22:37:45

回答

1

用于输入任意值,我会建议看一下液体模板或辐射标签 - 你可以建立自己的模板语言来隔离解释的代码。

另一种方法是使用JavaScript(或Cof​​feeScript的),并集成了一个JS解释 - 有一些是红宝石连接到不同的虚拟机JS工具。

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

你例子每个人实际上可以使用这种方法

  • 处理务必要充电:$ X
  • X的订单价值总额的
  • X%,或$ Y的%,取更大

安全,从UX角度来看可能是更友好的方法。

+0

感谢您的评论。那里有一些好点子。我很喜欢你的Javascript建议(johnson或therubyracer,也许),尽管你的模板选项之一可能是可行的,如果他们应付足够复杂的表达式;我会检查出来的! – NeilS 2011-02-10 22:47:03

0

有一个简单,安全的脚本语言,我可以让用户输入表达式

Lua一直被称为这样。