从C API调用Lua脚本的执行时间限制。

有没有办法为加载和执行 lua 文件的这两个 C++ 语句设置执行时间限制(例如 10-20 秒)?

由于 Lua 文件是不可信的,我不希望恶意用户在 Lua 代码中使用无限循环无限期地挂起程序。

标记 C,因为 Lua API 是 C,标记 C++,因为我正在使用 C++。

luaL_loadfile(mState, path.c_str());
lua_pcall(mState, 0, 0, 0);

原文链接 https://stackoverflow.com/questions/3400851

点赞
stackoverflow用户385433
stackoverflow用户385433

lua_set_hook可以用来告诉解释器在执行每个“count”指令后调用一个钩子。这样,您可以监视用户脚本并在它消耗完配额时终止它:

int lua_set_hook(lua_State * L,lua_Hook f,int mask,int count);

这也可以从Lua中使用:

debug.sethookfunction()print(“今天就这样够了”);os.exit(0);end,“”,10000)
for i = 1,10000 do end

如果您使用了来自http://lua-users.org/wiki/SandBoxes的技术,那么您可以完全从Lua设置一个安全的执行环境与sethook()和朋友们,然后在执行用户脚本时切换到沙箱模式。我已经在这里尝试了一下,只是为了让您开始:

- 设置一个执行配额
local function set_quota(secs)
 local st = os.clock()
函数检查()
  如果os.clock()-st >秒,则
    debug.sethook() - 禁用钩子
    错误(“超出配额”)
  结束
 结束
调试.sethook(检查,“”,100000);
结束

- 这些是全局对象,用户可以使用:
local env = {print = print}

- 允许用户代码运行5秒。
set_quota(5)

- 在环境下运行代码:
local function run(untrusted_code)
 本地的不可信函数,消息= loadstring(untrusted_code)
如果不是不可信的功能,则返回nil,消息结束
setfenv(untrusted_function,env)
返回pcall(untrusted_function)
结束

- 这是用户代码:
本地userscript = [[
函数fib(n)
 如果n <2则返回n
 否则返回fib(n-2)+ fib(n-1)
 结束
for n = 1,42 do print(n,fib(n))结束
]]
- 调用它:
本地车站,公共汽车= run(userscript)
print(r,m)

这应该在5秒内打印fib()的值,然后显示一个错误。

2010-08-03 21:30:34