Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function “你怎么看?”;沙盒“;功能?_Function_Lua_Sandbox_Lua 5.1 - Fatal编程技术网

Function “你怎么看?”;沙盒“;功能?

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编

目前,我正在用Lua编写一个沙盒。到目前为止它还在工作,但是我可以使用
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