ファイルまたは他のIOソースから、完全に信頼できるわけではないサードパーティから提供されるLuaテーブルが必要だとしましょう。
「{['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 を返す必要があります。これは、「通常の悪意のある人」に対して安全であると見なすことができます:)