gpt4 book ai didi

lua - 在 Lua 5.2 中重新创建 setfenv()

转载 作者:行者123 更新时间:2023-12-04 01:17:55 24 4
gpt4 key购买 nike

如何重新创建 setfenv 的功能在 Lua 5.2 中?我在理解您应该如何使用新的 _ENV 时遇到了一些麻烦。环境变量。

在 Lua 5.1 中你可以使用 setfenv很容易地沙箱任何功能。

--# Lua 5.1

print('_G', _G) -- address of _G

local foo = function()
print('env', _G) -- address of sandbox _G
bar = 1
end

-- create a simple sandbox
local env = { print = print }
env._G = env

-- set the environment and call the function
setfenv(foo, env)
foo()

-- we should have global in our environment table but not in _G
print(bar, env.bar)

运行此示例显示输出:
_G    table: 0x62d6b0
env table: 0x635d00
nil 1

我想在 Lua 5.2 中重新创建这个简单的例子。下面是我的尝试,但它不像上面的例子那样工作。
--# Lua 5.2

local function setfenv(f, env)
local _ENV = env or {} -- create the _ENV upvalue
return function(...)
print('upvalue', _ENV) -- address of _ENV upvalue
return f(...)
end
end

local foo = function()
print('_ENV', _ENV) -- address of function _ENV
bar = 1
end

-- create a simple sandbox
local env = { print = print }
env._G = env

-- set the environment and call the function
foo_env = setfenv(foo, env)
foo_env()

-- we should have global in our envoirnment table but not in _G
print(bar, env.bar)

运行此示例显示输出:
upvalue    table: 0x637e90
_ENV table: 0x6305f0
1 nil

我知道关于这个主题的其他几个问题,但它们似乎主要是处理加载动态代码(文件或字符串),使用新的 load 可以很好地工作。 Lua 5.2 中提供的函数。在这里,我特别要求一种在沙箱中运行任意函数的解决方案。我想在不使用 debug 的情况下执行此操作图书馆。根据 Lua documentation我们不应该依赖它。

最佳答案

如果不使用 Lua 5.2 中的 Lua 调试库,则无法更改函数的环境。一旦创建了一个函数,这就是它所拥有的环境。修改这个环境的唯一方法是修改它的第一个 upvalue,这需要调试库。

Lua 5.2 中环境的一般思想是,环境应该被认为是不可变的,而不是诡计(即:调试库)。你在一个环境中创建一个函数;一旦在那里创建,那就是它拥有的环境。永远。

这就是 Lua 5.1 中经常使用的环境的方式,但是通过随意的函数调用来修改任何环境的环境是很容易和被认可的。如果你的 Lua 解释器删除了 setfenv (防止用户破沙箱),那么用户代码内部就不能为自己的函数设置环境。所以外部世界有一个沙箱,但内部世界不能有沙箱内的沙箱。

Lua 5.2 机制使得在创建函数后更难修改环境,但它允许您在创建期间设置环境。这让您可以在沙箱内进行沙箱。

所以你真正想要的是像这样重新排列你的代码:

local foo;

do
local _ENV = { print = print }

function foo()
print('env', _ENV)
bar = 1
end
end
foo现在被沙盒化了。现在,有人要打破沙箱要困难得多。

可以想象,这在 Lua 开发人员中引起了一些争论。

关于lua - 在 Lua 5.2 中重新创建 setfenv(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14290527/

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