【发布时间】:2014-09-04 05:42:03
【问题描述】:
我想实现类似沙盒的东西
- eval 给定字符串
- 在与 eval 相同的上下文中执行给定的块
- 返回block的结果
沙盒的目的是检查内容 - 函数、变量等。 - 易受攻击的代码。
这是我的规格
it 'returns return value of given block' do
value = Sandbox.secure_eval('hoge = ["hoge", "fuga"]') do
hoge[0]
end
expect(value).to eq('hoge')
end
而且,这是我的沙盒实现
require 'timeout'
module Sandbox
def self.secure_eval(code, timeout: 5, safe_level: 2)
raise ArgumentError, 'please set call back by block' unless block_given?
proc = Proc.new do
Timeout::timeout timeout do
$SAFE = safe_level
eval code do
yield
end
end
end
proc.call
end
end
但是#secure_eval返回的是eval的结果,在本例中是["hoge", "fuga"],无法捕获block的返回值。
我该怎么做?
【问题讨论】:
-
我认为该块不会在任何地方被调用 -
eval不接受块... -
引用Ruby Security:“但是,
$SAFE不提供执行不受信任代码的安全环境。”您应该永远依赖$SAFE或 Ruby(或大多数其他语言)内置的任何其他通用“安全代码执行”机制来保护您在执行不受信任(并且可能是恶意)时免受伤害代码。你的沙盒根本不是沙盒!
标签: ruby eval return-value yield