代码之家  ›  专栏  ›  技术社区  ›  Zepplock

Ruby/Rails中有没有执行字符串中的代码的方法?

  •  47
  • Zepplock  · 技术社区  · 16 年前

    所以我有一个不同代码示例的数据库(读取代码片段)。 代码示例由用户创建。 Rails中有执行它的方法吗?

    例如,我的数据库中有以下代码(id=123):

    return @var.reverse
    

    我有办法执行吗?类似:

    @var = 'Hello'
    @result = exec(CodeSample.find(123))
    

    所以结果就是“奥利”

    3 回复  |  直到 10 年前
        1
  •  77
  •   Pesto    16 年前

    你可以使用 eval :

    code = '@var.reverse'
    @var = 'Hello'
    @result = eval(code)  # => "olleH"
    

    但是要非常小心地这样做;您要让代码完全访问您的系统。试行 eval('exit()') 看看会发生什么。

        2
  •  14
  •   SFEley    16 年前

    eval 我想补充一句:给你一本鹤嘴锄书 Programming Ruby Programming Ruby 1.9 根据您的Ruby版本)并阅读 “把红宝石锁在保险箱里。” 这一章是关于Ruby的安全级别和被污染的对象的,这一章以 确切地 你的用例以及为什么你需要偏执。

        3
  •  2
  •   Tyrone Wilson    10 年前

    如果您有一个非常有限的用例或者限制用例,您还可以使用另一种方法。

    我必须使用这种方法来允许用户动态地指定相对时间,例如 3.months.ago

    我使用了一个regex来清理用户输入的内容。

    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
    

    您可以扩展regex以允许 from_now 或者为允许的操作创建一个regex数组,并在上面循环。

    欢迎对此方法发表任何评论。