gpt4 book ai didi

ruby - 为什么 block 不像方法那样继承调用者的 $SAFE 级别?

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

当 $SAFE = 4 的线程调用方法时,该方法以相同的 $SAFE 级别运行:

def test_method
raise "value of $SAFE inside the method: #{$SAFE}"
end
t = Thread.new{$SAFE = 4; self.test_method}; t.join
=> RuntimeError: value of $SAFE inside the method: 4

但是,当一个 block 被调用时,它似乎使用了来自其原始上下文的 $SAFE:

test_lambda = lambda do
raise "value of $SAFE inside the lambda: #{$SAFE}"
end
t = Thread.new{$SAFE = 4; test_lambda.call}; t.join
=> RuntimeError: value of $SAFE inside the lambda: 0

有人能解释一下为什么会这样吗?这似乎是一个安全问题。

(我使用 raise 而不是 puts 的原因是 puts 在 $SAFE = 4 时不起作用)

这可用于在看似安全的上下文中评估受污染的字符串:

test_lambda = lambda{|s| puts "Tainted: #{s.tainted?}"; eval s}
t = Thread.new{$SAFE = 4; test_lambda.call("puts `date`")}; t.join
=> Tainted: true
=> Fri Mar 30 03:15:33 UTC 2012

最佳答案

这是因为 lambda 在其定义的范围内运行(包括所有局部变量!)

因此,您在安全级别 0 定义了 lambda,因此它在调用时在该级别执行,因为这就是变量的状态。

关于ruby - 为什么 block 不像方法那样继承调用者的 $SAFE 级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9916991/

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