【问题标题】:What exactly is setmetatable, and how do I avoid it for security reasons?究竟什么是 setmetatable,出于安全原因,我该如何避免它?
【发布时间】:2020-08-27 16:21:28
【问题描述】:

通常沙盒会阻止 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,就像使用任何 Lua 沙箱一样。您是在问如何让某人仍然获得setmetatable 的效果而不调用它,或者调用它的更“安全”版本?您到底想避免哪些安全问题?

标签: lua lua-table metatable nlua


【解决方案1】:

由有能力的开发人员编写的沙盒不会阻止常规的setmetatable 函数。例如,维基百科使用the Scribunto extension,它允许任何人在站点上编写和运行Lua,它允许不受限制地使用setmetatable。 (但是,它确实会阻止debug.setmetatable,以及debug 的大部分其余部分。)通常,当沙盒确实阻止setmetatable 时,这是因为它的开发人员要么不了解用户数据的工作原理,不要'不明白 debug.setmetatablesetmetatable 是不同的,和/或不明白 __metatable 做了什么。没有必要限制它。

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多