Ressourcenlimits und Instrumentierung
Verwenden Sie debug.sethook, um Instruktionen zu zählen und CPU-Budgets durchzusetzen
Ressourcenlimits und Instrumentierung ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Ressourcenlimits?
Nicht vertrauenswürdiger Code kann durch endlose Ausführung (CPU), die Zuweisung großer Speichermengen oder die Erzeugung übermäßiger Ausgaben einen DoS verursachen. Ressourcenlimits schützen den Host.
CPU-Limit mit debug.sethook
Zählen Sie die ausgeführten Instruktionen und brechen Sie die Ausführung ab, sobald das Limit überschritten wird.
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
endGranularität der Zählung
Das dritte Argument von sethook (count) legt fest, wie oft der Hook ausgelöst wird. Kleinere Werte sind genauer, verursachen aber mehr Overhead. 50–500 ist ein üblicher Bereich.
Speicherlimit mit collectgarbage
Prüfen Sie die Speichernutzung innerhalb des Hooks und brechen Sie die Ausführung ab, wenn sie einen Schwellenwert überschreitet.
local MEM_LIMIT_KB = 1024 -- 1 MB
debug.sethook(function()
if collectgarbage("count") > MEM_LIMIT_KB then
error("Memory limit exceeded")
end
end, "", 200)Limit für die verstrichene Zeit
Kombinieren Sie dies mit os.clock(), um die verstrichene Zeit statt der Anzahl der Instruktionen oder zusätzlich dazu zu begrenzen.
local deadline = os.clock() + 0.5 -- 500ms
debug.sethook(function()
if os.clock() > deadline then
error("Time limit exceeded")
end
end, "", 100)Ausgabelimit
Umschließen Sie die print-Funktion der Sandbox, um die Anzahl der geschriebenen Bytes zu zählen, und verweigern Sie nach Erreichen eines Limits weitere Ausgaben.
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
endInstrumentierung zur Profilerstellung
Verwenden Sie die Hook-Ereignisse "call" und "return", um einen instrumentierten Aufrufgraphen des Sandbox-Codes zu erstellen.
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
Die Limits von debug.sethook gelten pro Thread. Setzen Sie für jede Coroutine einen eigenen Hook, wenn Sandbox-Code Coroutinen erzeugt.
Ressourcennutzung melden
Melden Sie nach der Ausführung der Sandbox: ausgeführte Instruktionen, verwendeten Speicher, Ausgabelänge und verstrichene Zeit. Das ist nützlich zur Erkennung von Missbrauch und zur Durchsetzung von Kontingenten.
Verschachtelte Sandboxes
Wenn ein Sandbox-Plugin selbst Sub-Sandboxes erstellen kann, müssen Sie sicherstellen, dass die Ressourcenlimits der übergeordneten Sandbox an das untergeordnete Element vererbt oder für dieses verschärft werden.
Werkzeuge für den Produktiveinsatz
Werkzeuge: luasandbox (LuaJIT), Lua-Docker-Container mit seccomp und benutzerdefinierte Allokatoren mit einer harten Speicherobergrenze. Kombinieren Sie diese mit cgroups auf Betriebssystemebene, um eine starke Absicherung zu erreichen.
Frage zu Ressourcenlimits
Wie erzwingt debug.sethook ein CPU-Limit?
Zusammenfassung: Ressourcenlimits und Instrumentierung
Verwenden Sie debug.sethook, um CPU-Limits (Anzahl der Instruktionen), Speicherlimits (Prüfung mit collectgarbage) und Zeitlimits (os.clock) durchzusetzen. Umschließen Sie print, um die Ausgabe zu begrenzen. Melden Sie die Nutzung nach der Ausführung zur Überwachung und Durchsetzung von Kontingenten.
Lerne Lua mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 40
- Lektionen
- 159
Häufig gestellte Fragen
Ist die Lektion „Ressourcenlimits und Instrumentierung“ kostenlos?
Ja — der vollständige Text von „Ressourcenlimits und Instrumentierung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Ressourcenlimits und Instrumentierung“?
Verwenden Sie debug.sethook, um Instruktionen zu zählen und CPU-Budgets durchzusetzen Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Lua Academy zu starten?
Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Ressourcenlimits und Instrumentierung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?
Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Das _ENV-Modell in Lua 5.2+
- Eine eingeschränkte Sandbox erstellen
- Sandbox-Escape verhindern
- Ressourcenlimits und Instrumentierung