Function “你怎么看?”;沙盒“;功能?
目前,我正在用Lua编写一个沙盒。到目前为止它还在工作,但是我可以使用Function “你怎么看?”;沙盒“;功能?,function,lua,sandbox,lua-5.1,Function,Lua,Sandbox,Lua 5.1,目前,我正在用Lua编写一个沙盒。到目前为止它还在工作,但是我可以使用getfenv函数将作用域移出沙箱。对于我的沙盒,我用可信函数和库填充了一个空表。但是,使用诸如print之类的函数,可以使用getfenv获取该范围内的全局变量。例如: asd=“asd” 断言(pcall)断言(load([[ 打印(getfenv(print.asd)——“asd” ]],nil,“t”,{print=print,getfenv=getfenv}) 这显然可以让“对手”绕过沙箱。您需要为getfenv编
getfenv
函数将作用域移出沙箱。对于我的沙盒,我用可信函数和库填充了一个空表。但是,使用诸如print
之类的函数,可以使用getfenv
获取该范围内的全局变量。例如:
asd=“asd”
断言(pcall)断言(load([[
打印(getfenv(print.asd)——“asd”
]],nil,“t”,{print=print,getfenv=getfenv})
这显然可以让“对手”绕过沙箱。您需要为
getfenv
编写一个包装,以防止未打包的环境泄漏,如下所示:
局部函数my_getfenv(func)
本地环境
如果类型(func)=“数字”,则
如果FUNC清楚,您就不必考虑<代码> GETFIFV 信任函数。那为什么要把它暴露在沙箱里?LuaJIT,Lua5.1
local function my_getfenv( func )
local env
if type( func ) == 'number' then
if func <= 0 then
error( "'getfenv' cannot get the global environment" )
end
env = old_getfenv( func + 1 )
elseif type( func ) == 'function' then
env = old_getfenv( func )
else
error( "'getfenv' cannot get the global environment" )
end
if protectedEnvironments[env] then
return nil
else
return env
end
end