从这篇文章 http://www.stuartellis.eu/articles/erb 参照线程安全级别:

“在这一水平上,为可信为ERB使用它指定的绑定必须被标记。”

我已经搜查高和低,还没有找到一种方法来“标记”绑定为“值得信赖的”。

请问有人请赐教?

有帮助吗?

解决方案

您应该的污点的通过调用taint方法结合。

$SAFE水平是红宝石的一个特征是否认取决于电流电平的某些动作和对象是否是<强>污点即可。被感染的字符串被假定来自非置信源,如文件,数据库,HTTP客户端,等等始发。

目前$SAFE级别1中,例如,红宝石将不允许你require文件,如果该参数是一个被感染的字符串。

$SAFE水平4是最极端的。红宝石将有效禁止用户修改的任何nontained 对象。这个想法是,你可以在你的应用程序中使用较低的$SAFE水平,并实例化一个线程或进程内与$SAFE 4级。在这个沙盒上,您可以修改污染对象只

ERB使用这个机制允许你运行一个沙箱中的模板。如果你试图从某个绑定渲染模板的结果,这是发生了什么:

class TemplateContext
  def name; "Teflon Ted"; end
end

template_binding = TemplateContext.new.send(:binding)
ERB.new("Hi, <%= name %>!", 4).result(template_binding)

#=> SecurityError: Insecure: can't modify trusted binding

布拉姆!这是Ruby的告诉你,这是不行修改nontainted 是在$SAFE 4级对象时,它不会让你打电话eval与给定结合(这正是ERB尝试)。

相反,应该提供具有的污点沙盒结合。您明确告诉红宝石,这是好的,在沙箱中使用该绑定,并且,它不应该在沙箱外是可信的。

class TemplateContext
  def name; "Teflon Ted"; end
end

# Binding must be tainted!
template_binding = TemplateContext.new.send(:binding).taint
ERB.new("Hi, <%= name %>!", 4).result(template_binding)

#=> "Hi, Teflon Ted!"

有关Ruby的$SAFE级别的详细信息,请参阅镐书中优良描述。

scroll top