你如何标记一个Ruby绑定的信任?
-
26-09-2019 - |
题
从这篇文章 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
级别的详细信息,请参阅镐书中优良描述。
不隶属于 StackOverflow