保护应用程序免受错误的Lua脚本

我正在一个微控制器项目中使用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
用户107090
设置一个行钩或计数钩,并在超出限制时中止。
2018-07-12 12:33:23
用户6834680
用户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.jsonuser_script.lua

2018-07-12 13:09:06