【发布时间】: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