Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Ruby中(安全地)解释用户输入的表达式_Ruby On Rails_Ruby - Fatal编程技术网

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

Ruby on rails 在Ruby中(安全地)解释用户输入的表达式,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在创建一个Rails应用程序,它为多个客户端提供了一个电子商务元素,我希望这些客户端能够在管理区域中指定一个公式来计算它们的发货量;因为方法可能不同 让我们先假设我允许他们输入ruby代码,然后我稍后(在计算订单的发货量时)评估结果——这将是相当灵活的,因为如果我事先设置一些适当的变量,他们可以输入不同的公式,例如: 5.00#静态量-始终收取5.00 订单总额*0.1#订单价值的10% [order.total*0.1,3.00]。最多为总额的10%,或3.00,以较大者为准 订单。国外

我正在创建一个Rails应用程序,它为多个客户端提供了一个电子商务元素,我希望这些客户端能够在管理区域中指定一个公式来计算它们的发货量;因为方法可能不同

让我们先假设我允许他们输入ruby代码,然后我稍后(在计算订单的发货量时)评估结果——这将是相当灵活的,因为如果我事先设置一些适当的变量,他们可以输入不同的公式,例如:

  • 5.00#静态量-始终收取5.00
  • 订单总额*0.1#订单价值的10%
  • [order.total*0.1,3.00]。最多为总额的10%,或3.00,以较大者为准
  • 订单。国外运输?10.00:5.00#10.00海外客户,5.00国内客户
。。。当然,在这些主题上有一百种变化

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

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

我必须能够从ruby内部解释和运行该语言,但该语言本身并不一定是ruby——它几乎可以是任何东西,尽管我更希望它对客户端具有相当的可读性,并且能够处理我在上面的ruby示例中使用的那种表达式。当他们输入表达式时,如果我能够语法检查表达式,并向客户机指出任何明显的错误,那么Brownie就会指出


(当然,除非你能告诉我如何用ruby进行“安全”的沙盒评估,这也符合要求。)

对于输入任意值,我建议看一看液体模板或辐射标记之类的东西——你可以构建自己的模板语言来隔离解释的代码

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

也就是说,我认为通过一些智能用户界面来处理这个问题可能比让用户输入公式更容易。选择两个最有可能的装运选项,构建一组用于输入值的小部件,然后只需将其验证为整数即可

实际上,您的每个示例都可以使用这种方法进行处理

  • 始终收费:$X
  • 订单价值的X%
  • 总额的X%,或$Y,以较大者为准
安全,从用户体验的角度来看,这可能是一种更友好的方法

是否有一种简单、安全的脚本语言允许用户输入表达式


一直以来都是这样。

谢谢您的评论。那里有一些好主意;我完全被你的Javascript建议所吸引(也许是johnson或therubyracer),尽管如果你的模板选项能够处理足够复杂的表达式,那么其中一个也可能是可行的;我会查出来的!