gpt4 book ai didi

ruby - 如何从 ruby​​ 加载中捕获返回值?

转载 作者:太空宇宙 更新时间:2023-11-03 18:24:46 25 4
gpt4 key购买 nike

我想为我正在构建的 cms 加载一个主题。我在想有一个名为 name_of_theme.themespec 的文件。我会加载这个。类似于 Bundler 对 gemspecs 的收费。我在想在这个文件中我会有类似的东西:

Theme.new do |t|
t.value = 'hi'
end

我想在加载脚本后捕获这个主题实例。我应该只捕获文件的内容并评估它们吗?这让我想到了一个后续问题,加载文件之间有什么区别……阅读内容和评估……我知道“评估”通常被认为是破坏的预兆……也许这个用例可以吗?

跟进

基于选择的答案.. 为什么我得到:

evaluationContext = Fiber.new {$SAFE = 4; Fiber.yield binding}.resume
=> #<Binding:0x007f85fc8a0fc8>
a = evaluationContext.eval('puts $SAFE')
=> 0

最佳答案

好吧,有一些差异,但如果您已经接受外部代码,则安全漏洞的差距与 evalrequire 的大小相同。实际上,在这种情况下,eval 可能安全,因为它可以让您控制代码执行的 namespace 和安全级别。这很重要,因为,比方说,您的应用程序处理某人的电子邮件密码。如果让主题在主命名空间 (require) 中执行,它可以做一些卑鄙的事情,比如重新定义 Kernel#gets 以将数据记录到恶意服务器等。虽然它听起来很牵强,还是安全点好。所以这里是你如何进行这种类型的安全加载:

evaluationContext = Fiber.new {$SAFE = 4; Fiber.yield binding}.resume
theme = evaluationContext.eval(File.read("GrayTheme.themespec"))

注意:从主题调用的任何代码都将在 $SAFE 4 下执行,所以虽然对于大多数事情来说这很好(它们不能调用 system("rm -rf/")) , 如果有任何少量的 $SAFE 0 代码需要从主题中调用, 代码必须在您仍处于安全级别 0 时在 lambda 中创建, 然后传递给安全级别 4 中的代码 (因为 lambda 保留了它们的安全值)。

编辑:尝试用这个替换 eval 行:

theme = eval(File.read("blahblahba"), evaluationContext)

关于ruby - 如何从 ruby​​ 加载中捕获返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12998347/

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