Lua Academy · Lektion

Ressourcenlimits und Instrumentierung

Verwenden Sie debug.sethook, um Instruktionen zu zählen und CPU-Budgets durchzusetzen

Lektion 4 von 413 Schritte

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
end

Granularitä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
end

Instrumentierung 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.

Kostenlos starten

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

  1. Das _ENV-Modell in Lua 5.2+
  2. Eine eingeschränkte Sandbox erstellen
  3. Sandbox-Escape verhindern
  4. Ressourcenlimits und Instrumentierung
← Zurück zu Lua Academy