来自这篇文章http://www.stuartellis.eu/articles/erb指的是线程安全级别:
“在这个级别,必须将指定的绑定标记为受信任的 ERB 才能使用它。”
我搜索了高低,并没有找到将绑定“标记”为“受信任”的方法。
有人请赐教吗?
来自这篇文章http://www.stuartellis.eu/articles/erb指的是线程安全级别:
“在这个级别,必须将指定的绑定标记为受信任的 ERB 才能使用它。”
我搜索了高低,并没有找到将绑定“标记”为“受信任”的方法。
有人请赐教吗?
您应该通过调用该方法来污染绑定。taint
级别是 Ruby的$SAFE
一项功能,它根据当前级别以及对象是否被污染来拒绝某些操作。假定受污染的字符串来自不受信任的来源,例如文件、数据库、HTTP 客户端等。
例如,在级别 1,如果参数是受污染的字符串$SAFE
,Ruby 将不允许您创建文件。require
$SAFE
4级是最极端的。Ruby 将有效地禁止您修改任何非保留对象。这个想法是您可以$SAFE
在应用程序中使用较低级别,并使用$SAFE
级别 4 实例化线程或 proc。在此沙箱中,您只能修改受污染的对象。
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 告诉您在第 4 级修改未污染对象是不可行$SAFE
的。它不允许您eval
使用给定的绑定进行调用(这正是 ERB 所尝试的)。
相反,您应该为沙箱提供受污染的绑定。您明确告诉 Ruby 可以在沙箱中使用此绑定,并且不应在沙箱之外信任它。
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
级别的更多信息,请参阅Pickaxe book 中的出色描述。