Lua沙盒加载许多脚本

Lua沙盒加载许多脚本,lua,wrapper,sandbox,lua-5.1,Lua,Wrapper,Sandbox,Lua 5.1,我想做一个可以定期加载脚本的包装器,但是在加载另一个脚本之前删除以前的脚本数据,加载的脚本应该可以访问所有全局函数,除了一些函数,比如“print”,它还应该修改一些函数的行为。 目前我有以下代码: local _print = print local _globalFunc = globalFunc local env = {} function newEnviorment() env = _G env.globalFunc = function() end env.print

我想做一个可以定期加载脚本的包装器,但是在加载另一个脚本之前删除以前的脚本数据,加载的脚本应该可以访问所有全局函数,除了一些函数,比如“print”,它还应该修改一些函数的行为。 目前我有以下代码:

local _print = print
local _globalFunc = globalFunc
local env = {}

function newEnviorment()
  env = _G
  env.globalFunc = function() end
  env.print = function (msg)
    _print('Wrapper says: '.. msg)
  end
  env.Somefunc = function() end
end

function loadScript (script)
  local loaded = loadstring(script)
  if loaded then
    setfenv(loaded, env)
    local ex = pcall(loaded)
  end
end

当我想加载一个新脚本时,我调用这两个函数,这段代码有什么问题,因为它不能按预期工作。

您能提供预期的行为吗?当前,您的代码将覆盖
\u G
object的属性。我希望在创建新环境后删除脚本创建的变量。我想阻止脚本访问我创建的带有下划线符号的函数。因此,请尝试使用Egor Skriptunoff answer-而不是
env=\u G
为您需要的每个环境创建新对象。请添加一个关于如何工作的解释。我还编辑了一个打字错误(newEnvironment->newEnvironment)@user465139-deniskrasakov已经解释了OP代码不起作用的原因。我答案中的代码显然是解决这个问题的一个方法。
function newEnvironment()
  env = setmetatable({}, {__index = _G})
  env.globalFunc = function() end
  env.print = function (msg)
    _print('Wrapper says: '.. msg)
  end
  env.Somefunc = function() end
end