gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:37:50 26 4
gpt4 key购买 nike

我正在为多个客户创建一个具有电子商务元素的 Rails 应用程序 - 我希望这些客户能够在管理区域中指定计算运费的公式;因为方法可能不同。

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

  • 5.00 # 静态金额 - 始终收取 5.00
  • order.total * 0.1 #订单值(value)的 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​​ 示例中使用的那种表达式。 Brownie 指出我是否有能力在他们输入表达式时对表达式进行语法检查,以向客户指出任何明显的错误。

(当然,除非您可以指出如何在 ruby​​ 中执行“安全”沙盒评估的方向,这也符合要求。)

最佳答案

对于输入任意值,我建议看一下 Liquid Templates 或 Radiant Tags 之类的东西 - 您可以构建自己的模板语言来隔离解释的代码。

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

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

你们每个例子实际上都可以用这种方法处理

  • 总是收费:$X
  • 订单值(value)的 X%
  • 总数的 X%,或 $Y,以较大者为准

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

关于ruby-on-rails - 在 Ruby 中(安全地)解释用户输入的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4963239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com