我如何保护我的lua脚本免遭全局表被转储?

我如何保护我的lua脚本免遭全局表被转储

点赞
用户734069
用户734069

如果你使用的是 Lua 5.2 或以上的版本,pairs 函数会检查 __pairs 元方法。如果存在,它将调用它来生成 pairs 调用的枚举数据。因此,您可以通过给该表一个 __pairs 元方法来防止其他人迭代全局表,该元方法要么返回一个“空”迭代器(return function() return nil end, nil, nil),要么只是用 error 抛出错误。

然而,Lua 的 next 函数(它不是 debug 库的一部分)不关心 __pairs 元方法。它提供了对整个表的迭代。

因此,您还需要从脚本可以访问的内容中删除 next ,或者使用一个函数包装 next ,如果表具有 __pairs 元方法,则返回nil 或通过 error 异常处理。

在 Lua 5.2 之前,您将不得不编写自己的 pairs (和next)版本,有效地执行这些操作(即检查 __pairs 元方法并采取适当的行动)。

2020-07-14 15:03:40
用户4515989
用户4515989

1. 在全局表的子集中执行函数

你可以使用 setfenv 函数来实现这个目的(更多细节参见 这里)。

示例(Lua <5.2):

function someMaliciousFunction()
    -- 做一些事情
end

someMaliciousFunction = setfenv(someMaliciousFunction, {
    -- 选择这个函数应该能做的任何事情
    ["print"] = _G.print
})

-- 这个函数将把上面的表视为它的 _G 表
someMaliciousFunction()

示例(Lua >=5.2):

function someMaliciousFunction()
    -- 做一些事情
end

local temp = _ENV
_ENV = {
    -- 选择这个函数应该能做的任何事情
    ["print"] = _G.print
}

-- 这个函数将把上面的表视为它的全局表
someMaliciousFunction()

_ENV = temp

2. 临时覆盖全局表

你也可以覆盖全局表。这将防止任何人使用 pairsipairs 迭代所有项目,但仍然保留对所有全局变量的合格访问。

示例:

local temp = _G
_G = setmetatable({}, {__index = temp, __newindex = temp})

someMaliciousFunction()

_G = temp
2020-07-14 16:05:41