Resourcebeperkingen en instrumentatie
Gebruik debug.sethook om instructies te tellen en CPU-budgetten af te dwingen
Resourcebeperkingen en instrumentatie is een gratis Lua Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Lua Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Lua Academy bevat in totaal 4 lessen.
Waarom resourcebeperkingen?
Niet-vertrouwde code kan een DoS veroorzaken door oneindig te blijven draaien (CPU), enorme hoeveelheden geheugen toe te wijzen of buitensporig veel uitvoer te genereren. Resourcebeperkingen beschermen de hostomgeving.
CPU-limiet via debug.sethook
Tel de uitgevoerde instructies en breek de uitvoering af zodra de limiet wordt overschreden.
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
endPrecisie van het tellen
Het derde argument van sethook (count) bepaalt hoe vaak de hook wordt uitgevoerd. Kleinere waarden zijn nauwkeuriger, maar veroorzaken meer overhead. 50–500 is een gebruikelijk bereik.
Geheugenlimiet via collectgarbage
Controleer het geheugengebruik in de hook en breek de uitvoering af als het een drempel overschrijdt.
local MEM_LIMIT_KB = 1024 -- 1 MB
debug.sethook(function()
if collectgarbage("count") > MEM_LIMIT_KB then
error("Memory limit exceeded")
end
end, "", 200)Limiet voor verstreken tijd
Combineer dit met os.clock() om de verstreken tijd te beperken in plaats van, of naast, het aantal instructies.
local deadline = os.clock() + 0.5 -- 500ms
debug.sethook(function()
if os.clock() > deadline then
error("Time limit exceeded")
end
end, "", 100)Uitvoerl界miet
Wikkel de print-functie van de sandbox in om het aantal geschreven bytes te tellen en verdere uitvoer na een limiet te weigeren.
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
endInstrumentatie voor profilering
Gebruik de hookgebeurtenissen "call" en "return" om een geïnstrumenteerde aanroepegrafiek van sandboxcode op te bouwen.
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")Coroutine-hooks
Beperkingen van debug.sethook gelden per thread. Stel hooks afzonderlijk in op elke coroutine als code in de sandbox coroutines start.
Resourcegebruik rapporteren
Rapporteer na de uitvoering van de sandbox: het aantal uitgevoerde instructies, het gebruikte geheugen, de uitvoerlengte en de verstreken tijd. Dit is nuttig voor misbruikdetectie en het afdwingen van quota.
Geneste sandboxes
Als een plugin in de sandbox zelf subsandboxes kan maken, zorg er dan voor dat de resourcebeperkingen van de ouder-sandbox worden overgenomen of voor het kind worden aangescherpt.
Productietools
Tools: luasandbox (LuaJIT), Lua Docker-containers met seccomp en aangepaste geheugentoewijzers die het geheugen hard begrenzen. Combineer deze met cgroups op besturingssysteemniveau voor sterke garanties.
Vraag over resourcebeperkingen
Hoe dwingt debug.sethook een CPU-limiet af?
Samenvatting: resourcebeperkingen en instrumentatie
Gebruik debug.sethook om CPU-limieten (instructietelling), geheugenlimieten (controle met collectgarbage) en tijdslimieten (os.clock) af te dwingen. Wikkel print in om de uitvoer te beperken. Rapporteer het gebruik na de uitvoering voor bewaking en het afdwingen van quota.
Leer Lua met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 40
- Lessen
- 159
Veelgestelde vragen
Is de les “Resourcebeperkingen en instrumentatie” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Lua Academy, waaronder “Resourcebeperkingen en instrumentatie”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Lua Academy bevat in totaal 4 lessen.
Wat leer ik in “Resourcebeperkingen en instrumentatie”?
Gebruik debug.sethook om instructies te tellen en CPU-budgetten af te dwingen Je oefent met Lua Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Lua Academy te beginnen?
Ervaring vooraf is niet nodig. Lua Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Resourcebeperkingen en instrumentatie”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Lua Academy?
Ja. Elke les over Lua Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Het _ENV-model in Lua 5.2+
- Een beperkte sandbox bouwen
- Sandbox-ontsnappingen voorkomen
- Resourcebeperkingen en instrumentatie