资源限制和检测
使用 debug.sethook 统计指令数量并强制执行 CPU 配额。
资源限制和检测 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
为什么需要资源限制
不受信任的代码可能通过无限运行(占用 CPU)、分配大量内存或生成过多输出来发起拒绝服务攻击(DoS)。资源限制可以保护宿主。
通过 debug.sethook 限制 CPU
统计已执行的指令,并在超出限制时中止执行。
local function withCPULimit(fn, maxOps)
local ops = 0
debug.sethook(function()
ops = ops + 1
if ops > maxOps then error("CPU limit exceeded", 2) end
end, "", 50) -- check every 50 instructions
local ok, result = pcall(fn)
debug.sethook()
return ok, result
end统计粒度
sethook 的第三个参数(count)控制钩子的触发频率。数值越小,结果越准确,但开销也越大。50 到 500 是常见范围。
通过 collectgarbage 限制内存
在钩子中检查内存使用量,如果超过阈值就中止执行。
local MEM_LIMIT_KB = 1024 -- 1 MB
debug.sethook(function()
if collectgarbage("count") > MEM_LIMIT_KB then
error("Memory limit exceeded")
end
end, "", 200)挂钟时间限制
结合 os.clock() 使用,以限制实际经过的时间,而不是(或除了)限制指令数。
local deadline = os.clock() + 0.5 -- 500ms
debug.sethook(function()
if os.clock() > deadline then
error("Time limit exceeded")
end
end, "", 100)输出限制
包装沙箱的 print 函数,统计写入的字节数,并在达到限制后拒绝继续输出。
local totalOutput = 0
local OUTPUT_LIMIT = 10240 -- 10 KB
env.print = function(...)
local s = table.concat({...}, "\t") .. "\n"
totalOutput = totalOutput + #s
if totalOutput > OUTPUT_LIMIT then
error("Output limit exceeded")
end
output[#output+1] = s
end用于性能分析的插桩
使用 "call" 和 "return" 钩子事件,为沙箱代码构建插桩调用图。
local callGraph = {}
debug.sethook(function(event)
local info = debug.getinfo(2, "Sn")
local name = info.name or info.short_src
if event == "call" then callGraph[name] = (callGraph[name] or 0) + 1 end
end, "c")协程钩子
debug.sethook 的限制按线程分别生效。如果沙箱代码会创建协程,请分别为每个协程设置钩子。
报告资源使用情况
沙箱执行结束后,报告以下信息:已执行的指令数、已使用的内存、输出长度和经过的时间。这些信息有助于检测滥用并执行配额。
嵌套沙箱
如果沙箱插件本身可以创建子沙箱,请确保父沙箱的资源限制会由子沙箱继承,或对其进一步收紧。
生产环境工具
工具包括:luasandbox(LuaJIT)、带 seccomp 的 Lua Docker 容器,以及严格限制内存的自定义分配器。结合操作系统级 cgroups 可以实现可靠的限制。
资源限制问题
debug.sethook 如何实施 CPU 限制?
回顾:资源限制与插桩
使用 debug.sethook 实施 CPU 限制(指令数)、内存限制(检查 collectgarbage)和时间限制(os.clock)。包装 print 以限制输出。执行结束后报告使用情况,以便进行监控和配额执行。
常见问题解答
「资源限制和检测」课时是免费的吗?
是的 — 「资源限制和检测」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「资源限制和检测」这节课中我会学到什么?
使用 debug.sethook 统计指令数量并强制执行 CPU 配额。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「资源限制和检测」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。