对Lua表输入进行清理处理
2013-10-9 6:30:9
收藏:0
阅读:128
评论:4
假设我需要一个 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。 可以认为这是安全的,可以抵御“一般的恶意人” :)
点赞
用户415823
你可以在沙盒中运行不安全的代码。
以下是 Lua 5.1 中简单沙盒的示例(仅列举代码,省略错误处理):
local script = [[os.execute("rm -rf /")]]
local env = { print=print, table=table, string=string }
local f, err = loadstring(script)
if err then
-- 处理语法错误
end
setfenv(f, env)
local status, err = pcall(f)
if not status then
-- 处理运行时错误
end
在 Lua 5.2 中,您可以使用 load 函数将脚本加载到自己的环境中。
结果会从 pcall 返回运行时错误:
attempt to index global 'os' (a nil value)
编辑
正如 Lorenzo Donati 在评论中指出的那样,这不是防止恶意脚本的完整解决方案。它本质上只是允许您白名单为用户脚本批准的函数和表格。
有关处理恶意脚本的更多信息,建议查看以下问题: 嵌入式 Lua - 计时恶意脚本(例如无限循环) - 任何示例?
2013-10-08 21:52:18
用户2733013
在沙盒中运行不是安全的,检查源代码也不是很简单。一个想法:检查字节码!
嗯,实际上这也不是很简单,但是这里有一个懒惰的实现:http://codepad.org/mGqQ0Y8q。
2013-10-09 16:32:16
用户312586
我特别为此目的创建了 sandbox.lua。它将处理不安全的内容和DOS类型的攻击,假设你的环境可以访问 debug 设备。
https://github.com/kikito/sandbox.lua
注意,目前它只兼容Lua 5.1。
2013-10-10 18:46:08
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我认为这样不安全。尝试这个:
print(safeLoadTable [[{ foo = (function() print"yahoo" end)() } ]])编辑
或者这个,更加有趣:
print(safeLoadTable [[{ foo = (function() print(os.getenv "PATH") end)() } ]])但是我不建议将
os.getenv替换为os.execute。:-)这个问题解决起来并不容易。在执行
loadstring时,您正在执行一段Lua代码,避免代码注入并不简单。没有一种简单的字符串匹配技术是真正安全的。唯一安全的方法是实现一个Lua表语法子集的解析器,并在字符串上使用该解析器。顺便说一句,Lua团队甚至从Lua 5.2中剥离了字节码验证器,因为他们发现它易受攻击,而字节码比Lua源代码要简单得多。