- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 setfenv 对一些函数进行沙盒处理,我收到以下输出:
123
nil
为什么调用sandboxTest()
时testValue
是nil
,而在callSandboxedTest()
中访问时是123 >?
使用 LuaJIT 2.1.0-beta2 (Lua 5.1)
function sandboxTest()
print(testValue)
end
local aNumber = 123
function callSandboxedTest()
setfenv(1, {
print = print,
testValue = aNumber,
sandboxTest = sandboxTest
})
print(testValue)
sandboxTest()
end
callSandboxedTest()
最佳答案
环境不是调用堆栈的一部分。每个函数都有其自己的 环境。所以 sandboxTest
和 callSandboxTest
都有一个环境。更改一个函数的环境不会影响另一个函数的环境。
sandboxTest
将继续使用默认环境,因此它将访问常规全局表以查找 testValue
。由于 testValue
从未在全局表中设置,因此 sandboxTest
将得到 nil
。
这就是为什么在维护沙箱时,仔细选择向沙箱公开哪些功能非常重要。如果某个函数需要成为沙箱的一部分,则该函数需要设置其环境。
这就是为什么最好基于已编译的 Lua block 而不是单个函数进行沙箱化。创建函数时,创建的函数会继承当前环境。
关于LuaJIT setfenv 似乎没有设置对给定环境的进一步函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41404979/
我有这个: const {ops} = getOplogStreamInterpreter(strm); ops.del.subscribe(v => { console.log('delete
我四处搜索,据我所知,POST 表单请求已被限制为 10MB (http://golang.org/src/net/http/request.go#L721)。 如果我要在我的 ServeHTTP 方
我是一名优秀的程序员,十分优秀!