Ruby / Rails中是否有执行string中的代码的方法?
所以我有一个不同代码示例的数据库(阅读片段)。 代码示例是由用户创build的。 有没有办法在Rails执行它?
所以,例如我在我的数据库(ID = 123)有以下代码:
return @var.reverse
有没有办法让我来执行它? 就像是:
@var = 'Hello' @result = exec(CodeSample.find(123))
所以结果会是'olleH'
你可以使用eval
:
code = '@var.reverse' @var = 'Hello' @result = eval(code) # => "olleH"
但是这样做要非常小心, 您可以让该代码完全访问您的系统。 试试eval('exit()')
,看看会发生什么。
对于eval
答案(这是正确的答案),我会补充:拿到一个Pickaxe Book的副本( 编程Ruby或编程Ruby 1.9,取决于你的Ruby版本),并阅读“在安全中lockingRuby”一章。 这一章是关于Ruby的安全级别和受污染的对象的,本章将以您的用例为准,以及为什么您需要偏执一点。
如果您的用例非常有限,或者限制用例,也可以使用另一种方法。
我不得不使用这种方法来允许用户dynamic指定相对时间,例如3.months.ago
我用正则expression式来清理用户的input
PERMITTED_OPERATIONS = /^\{\%([1-9]\.(day|year|month|hour|minute)(s\.|\.)ago|Time\.now)\%\}$/ def permit?(operation) return !PERMITTED_OPERATIONS.match(operation.to_s).nil? end
您可以扩展正则expression式以允许from_now
,或者为允许的操作创build一个正则expression式数组并循环。
欢迎对这种方法提出任何意见。