【问题标题】:How to prevent setmetatable to be overridden如何防止 setmetatable 被覆盖
【发布时间】:2020-07-23 04:54:41
【问题描述】:

我想以安全的方式共享内容,而不会将其暴露给恶意代码。假设我有一个

基础插件

local BaseAddon = {}
local secretTable = {someContent = "hidden content"}

local function index(t,k)
  if (k == "SECRET") then
    return secretTable
  end
end

setmetatable(BaseAddon, {
  __index = index,
  __newindex = function() end,
  __metatable  = false, -- disallow setmetatable again
})

return BaseAddon -- or a global hook method...

和一个访问基本插件隐藏内容的子插件

local SubAddon = require("BaseAddon") -- or a global hook method...

SubAddon = SubAddon["SECRET"]
print(SubAddon.somelib) -- returns content

SubAddon = SubAddon["SECRETS"]
print(SubAddon.somelib) -- returns index local 'SubAddon' (a nil value)

但这仍然不安全。我现在可以简单地执行以下操作来发现我的秘密:

function newSetmetatable(table, mt)
    mt.__metatable = nil
    mt.__index = function(t,k)
      print(k)
      return t[k]
    end
    return originalSetmetatable (table, mt)
end
originalSetmetatable = setmetatable
setmetatable = newSetmetatable

有什么方法可以阻止这个或其他解决方案实际共享秘密表?

【问题讨论】:

    标签: security lua overriding lua-table metatable


    【解决方案1】:

    您的原始代码与您在 Lua 中获得的一样好。您在 Lua 中设置的任何类型的安全性都需要用 C 编写,或者在任何不受信任的代码运行之前运行。

    【讨论】:

      猜你喜欢
      • 2017-12-19
      • 2021-02-08
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 2018-01-22
      相关资源
      最近更新 更多