setmetatable 到底是什么,出于安全原因我该如何避免它?
What exactly is setmetatable, and how do I avoid it for security reasons?
通常沙箱会阻止 setmetatable,如下所示:
local function memoize(f)
local mt = {}
local t = setmetatable({}, mt)
function mt:__index(k)
local v = f(k)
t[k] = v
return v
end
return t
end
问题是,我不想使用 setmetatable。它到底是什么,我将如何解决它?在上述情况下,它只是一个复制的 'mt' 变量的全局变量吗?有什么我应该做的具体事情吗?
谢谢。
有能力的开发人员编写的沙盒不会阻止常规 setmetatable
功能。例如,维基百科使用 the Scribunto extension,它允许任何人在网站上写 运行 Lua,并且允许不受限制地使用 setmetatable
。 (但是,它确实会阻止 debug.setmetatable
,以及 debug
的大部分其他内容。)一般来说,当沙箱确实会阻止 setmetatable
,这是因为它的开发人员要么不理解userdata 是如何工作的,不明白 debug.setmetatable
和 setmetatable
是不同的,and/or 不明白 __metatable
是做什么的。不需要你去限制。
通常沙箱会阻止 setmetatable,如下所示:
local function memoize(f)
local mt = {}
local t = setmetatable({}, mt)
function mt:__index(k)
local v = f(k)
t[k] = v
return v
end
return t
end
问题是,我不想使用 setmetatable。它到底是什么,我将如何解决它?在上述情况下,它只是一个复制的 'mt' 变量的全局变量吗?有什么我应该做的具体事情吗?
谢谢。
有能力的开发人员编写的沙盒不会阻止常规 setmetatable
功能。例如,维基百科使用 the Scribunto extension,它允许任何人在网站上写 运行 Lua,并且允许不受限制地使用 setmetatable
。 (但是,它确实会阻止 debug.setmetatable
,以及 debug
的大部分其他内容。)一般来说,当沙箱确实会阻止 setmetatable
,这是因为它的开发人员要么不理解userdata 是如何工作的,不明白 debug.setmetatable
和 setmetatable
是不同的,and/or 不明白 __metatable
是做什么的。不需要你去限制。