保护应用程序免受错误的Lua脚本
2018-7-12 13:25:54
收藏:0
阅读:101
评论:2
我正在一个微控制器项目中使用Lua。 我的软件使用RTOS,除了其他任务之外,还调用用户提供的Lua脚本。
脚本必须有两个函数:一个'init'函数和一个'run'函数。我的应用程序在初始化期间调用'init'函数,然后定期调用'run'函数。
我加载脚本的方式与'dofile()'非常相似。
'run'函数需要返回。这样,底层线程将处理器让给其他优先级较低的线程。
那么问题来了,如何在我有机会调用所需函数之前,保护系统免受用户提供的“危险”脚本,即在初始执行之前永远不会完成脚本执行。 请参见以下内容:
function init
--做一些事情。
end
function run
--做一些其他事情。
end
while (true) do
--做恶意的事情,永远不返回。
end
在上面的例子中,代码在加载脚本期间被阻塞,并且永远不会返回。我没有机会调用'init'和'run'函数。如何检测这种情况,并如何得到保护?
编辑 忘记提到了。我正在使用Lua 5.2.2。
点赞
用户107090
2018-07-12 12:33:23
用户6834680
解决方案是延迟执行用户脚本,直到你准备好WD(守护进程)。
假设这是用户脚本:
user_script.lua
function init()
--Do some stuff.
end
function run()
--Do some other stuff.
end
while (true) do
--Do nasty stuff, without ever returning.
end
你现在在主机应用程序中正在做的事情(好像它是用Lua编写的)
dofile("user_script.lua")
init_watchdog()
init()
run()
run()
你应该在主机应用程序中做什么
local user_script_as_text = read_content_of_file("user_script.lua")
assert(loadstring(
[[
function init() -- this is your wrapper around user script
init = nil
do
]]..user_script_as_text..
[[
end
init() -- invoking "init" defined by user
end
]]
))()
init_watchdog()
init() -- invoking your wrapper
run()
run()
如果你需要在打开守护进程之前读取一些配置变量的值,那么这些配置变量必须以易于解析的字符串形式提供,如以下 var1=42,var2=on,var3="Hi"。这些配置变量不能在Lua脚本中,因为Lua脚本可能会无限循环。
换句话说,你需要从用户那里获取两个文件: user_config_vars.json 和 user_script.lua。
2018-07-12 13:09:06
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的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 代码?
