setmetatable到底是什么,出于安全考虑,如何避免?

问题描述 投票:1回答:1

一般沙盒都会屏蔽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'变量?我是不是应该做一些特殊的事情?

谢谢。

lua lua-table metatable nlua
1个回答
1
投票

有能力的开发者所写的沙盒不会阻挡常规的 setmetatable 函数。例如,维基百科使用 Scribunto扩展它允许任何人在网站上编写和运行Lua,并允许不受限制地使用 setmetatable. 不过,它确实阻止了 debug.setmetatable以及其他大部分地区 debug.) 一般来说,当沙盒确实阻挡了 setmetatable,这是因为它的开发者要么不了解用户数据的工作原理,要么不了解 debug.setmetatablesetmetatable 是不同的,或者不明白什么是。__metatable 确实如此。你没有必要限制它。

© www.soinside.com 2019 - 2024. All rights reserved.