假设我想要一个由第三方提供的 Lua 表,但不完全可靠,来自文件或其他 IO 源。
我将表格作为字符串获取,例如“{['valid'] = 10}”,我可以将其加载为
externalTable = loadstring("return " .. txtTable)()
但这会破坏代码注入,即:txtTable = os.execute('rm -rf /')
所以我做了这个消毒功能:
function safeLoadTable(txtTable)
txtTable = tostring(txtTable)
if (string.find(txtTable, "(", 1, true))
then return nil end
local _start = string.find(txtTable, "{", 1, true)
local _end = string.find(string.reverse(txtTable), "}", 1, true)
if (_start == nil or _end == nil)
then return nil end
txtTable = string.sub(txtTable, _start, #txtTable - _end + 1)
print("cropped to ", txtTable)
local pFunc = loadstring("return " .. txtTable)
if (pFunc) then
local _, aTable = pcall(pFunc)
return aTable
end
end
在最坏的情况下,它应该返回 nil。这可以被认为对“普通的坏人”是安全的吗:)