Ruby的脚本引擎?

3
我正在创建一个Ruby On Rails网站,其中一部分需要动态化,以便(某种程度上)信任的用户可以使网站的某些部分工作方式不同。为此,我需要一种脚本语言。在一个类似的ASP.Net项目中,我编写了自己的脚本语言/DSL。但我不能使用那个源代码(在工作中编写),如果不必要的话,我也不想再写一个脚本语言。

那么,我有哪些选择呢?脚本必须被锁定,不能崩溃我的服务器或其他东西。我真的很想使用Ruby作为脚本语言,但这并非必需。此外,这个脚本部分将在几乎每个网站请求时调用,有时会调用多次。所以速度是一个因素。

我看过RubyLuaBridge,但它是Alpha状态,而且似乎已经停止更新了。

在Ruby项目中,我有哪些选择脚本语言?

此外,我将完全控制这个项目的部署位置(根访问权限),所以没有真正的限制..


脚本引擎应该准确地能够做什么? - Pekka
1
你可以使用 eval,取决于你对用户的信任程度 :) - Daniel Rikowski
@DR(顺便说一下,两个字母的名称不会收到通知),问题在于我不太信任他们。即使我信任他们,我也不会相信一个初学者程序员在实时服务器上使用eval提示符。 - Earlz
非常相似的问题:https://dev59.com/8kbRa4cB1Zd3GeqPxR-6 - Jesse Millikan
客户端JavaScript是否是一个选择?这将避免一类问题(在服务器上执行危险操作),但会引发另一类问题(跨站脚本攻击)。根据用例,这可能是可以接受的权衡。 - Greg Campbell
显示剩余4条评论
3个回答

1

JRuby怎么样?您可以使用许多脚本语言的Java实现,例如JavaScript、Scheme等。


如果我要走这条路,我可能会只使用C-lua实现,并使用IPC从我的Ruby程序与其通信。 - Earlz

1

还有Rufus-lua,不过它只是0.1.0版本...


rufus-lua 版本为 1.1.0:http://github.com/jmettraux/rufus-lua它还被用在其他项目中:http://github.com/scottpersinger/laminate - jmettraux
哦哦哦...层压板。我猜这证明它也可以在Ruby中被沙盒化。这可能会成为被接受的答案。 - Earlz

1

好的,既然还没有建议,那么可以使用Pickaxe书中描述的将Ruby锁定在安全环境中。据我所知,这样可以让你使用Ruby语言而不会出现显著的减速。

这种技术旨在允许安全地沙盒化不受信任的Ruby代码和错误修复,并且讨论的重点是保持这种状态,但无限循环和其他一些事情仍然允许恶意用户占用CPU。(例如,可能会有这个讨论。)

我不知道的是如何从安全线程外部返回本质上安全的数据。单例对象(例如)可以模仿任何类,然后在调用返回线程中的任何方法时执行危险操作。我仍在Google上搜索相关信息。(《Ruby编程语言》指出,级别4“防止元编程方法”,这将允许您安全地验证返回对象的类,我想这将使结果变得安全可用。)

除此之外,实现具有动态作用域的Lisp-1可能并不难(*嘿嘿*),因为您已经有了垃圾收集器。

Lisp... 唉...第一个问题:我不懂 Lisp,所以我得先学会它然后再实现。第二个问题:Lisp 不是最理想的初学者编程语言。 - Earlz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接