假設我想要一個由第三方提供的Lua表,而不是完全可靠的從一個文件或其他IO源提供的。消毒一個Lua表輸入
我得到的表作爲一個字符串,如「{[‘有效’] = 10}」我可以加載它作爲
externalTable = loadstring("return " .. txtTable)()
但是,這將打開一個突破口代碼注入,即:txtTable = os.execute( '室射頻/')
所以我這樣做消毒功能:
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
在它應該返回零的最壞情況。 這可以被認爲是安全的反對「經常惡意的人」:)
這不會避免DOS類型的攻擊:嘗試'local script = [[local x = 1; for i = 1 ,1e100 do x = x + 1 end]]' –