gpt4 book ai didi

ruby - 如何将 Ruby 绑定(bind)标记为可信?

转载 作者:数据小太阳 更新时间:2023-10-29 07:13:11 27 4
gpt4 key购买 nike

来自这篇文章http://www.stuartellis.eu/articles/erb引用线程安全级别:

“在此级别,指定的绑定(bind)必须标记为受信任,ERB 才能使用它。”

我到处搜索,但没有找到一种方法来将绑定(bind)“标记”为“可信”。

谁能赐教吗?

最佳答案

您应该通过调用 taint 方法来污染绑定(bind)。

$SAFE 级别是 Ruby 的一项功能,它根据当前级别以及对象是否被污染 拒绝某些操作。假定受污染的字符串来自不受信任的来源,例如文件、数据库、HTTP 客户端等。

例如,在 $SAFE 级别 1,如果参数是受污染的字符串,Ruby 将不允许您require 文件。

$SAFE 4 级是最极端的。 Ruby 将有效地禁止您修改任何未被污染的 对象。这个想法是,您可以在应用程序中使用较低的 $SAFE 级别,并使用 $SAFE 级别 4 实例化线程或过程。在这个沙箱,您只能修改受污染对象。

ERB 使用此机制允许您在沙箱中运行模板。如果您尝试从某个绑定(bind)中获取渲染模板的结果,则会发生以下情况:

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

Blam!这是 Ruby 告诉你,在 $SAFE 级别 4 修改一个未受污染的对象是不行的。它不会允许您使用给定的绑定(bind)调用 eval(这正是 ERB 尝试的)。

相反,您应该为沙箱提供一个受污染 绑定(bind)。您明确告诉 Ruby 可以在沙箱中使用此绑定(bind),并且不应在沙箱外信任它。

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 级别的更多信息,请参阅 excellent description in the Pickaxe book .

关于ruby - 如何将 Ruby 绑定(bind)标记为可信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619516/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com