0Pricing
Lua Academy · Lektion

Eine eingeschränkte Sandbox erstellen

Erstellen Sie eine sichere _ENV-Whitelist und führen Sie nicht vertrauenswürdigen Code mit load() aus

Eine eingeschränkte Sandbox erstellen ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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.

Ziel

Mit einer eingeschränkten Sandbox können Sie nicht vertrauenswürdigen Lua-Code sicher ausführen: Der Code kann Berechnungen durchführen sowie Zeichenfolgen und Mathematik verwenden, aber nicht auf Dateisystem, Betriebssystem oder Netzwerk zugreifen.

Whitelist-Ansatz

Erstellen Sie die Sandbox-Umgebung von Grund auf und nehmen Sie nur sichere, gut verstandene Funktionen auf.

local function makeSandbox()
  return {
    print   = print,
    type    = type,
    tostring = tostring,
    tonumber = tonumber,
    pairs   = pairs,
    ipairs  = ipairs,
    next    = next,
    select  = select,
    unpack  = table.unpack,
    error   = error,
    pcall   = pcall,
    xpcall  = xpcall,
    math    = math,
    string  = { format=string.format, find=string.find,
                match=string.match, gmatch=string.gmatch,
                gsub=string.gsub, sub=string.sub,
                len=string.len, byte=string.byte, char=string.char },
    table   = { insert=table.insert, remove=table.remove,
                concat=table.concat, sort=table.sort,
                unpack=table.unpack, move=table.move },
  }
end

Code in der Sandbox ausführen

Laden und führen Sie den Benutzercode mit der Sandbox als _ENV aus.

local function runSandboxed(code, env)
  local fn, err = load(code, "user", "t", env)
  if not fn then return nil, err end
  return pcall(fn)
end
local env = makeSandbox()
local ok, err = runSandboxed("return 1+1", env)
print(ok, err)  -- true  2

Ausgabe abfangen

Ersetzen Sie print durch eine benutzerdefinierte Funktion, die die Ausgabe an einen Puffer anhängt, statt nach stdout zu schreiben.

local output = {}
env.print = function(...)
  local parts = {}
  for i = 1, select("#", ...) do
    parts[i] = tostring(select(i, ...))
  end
  output[#output+1] = table.concat(parts, "\t")
end

Werte zurückgeben

Damit der sandboxed Code Werte zurückgeben kann, rufen Sie den kompilierten Chunk als Funktion auf und fangen Sie seine Rückgabewerte ab.

local fn = load("return math.sqrt(144)", "user", "t", env)
if fn then
  local ok, result = pcall(fn)
  print(ok, result)  -- true  12.0
end

Exploits über Metamethoden blockieren

Sandboxed Code sollte keine Referenzen auf Metatabellen oder rawget/rawset erhalten, damit sich Feldbeschränkungen nicht umgehen lassen.

Länge von Zeichenfolgen begrenzen

Überschreiben Sie Operationen für Zeichenfolgen, um die Ausgabelänge zu begrenzen und DoS-Angriffe durch riesige Zeichenfolgenzuweisungen zu verhindern.

Ressourcenbegrenzung mit debug.sethook

Fügen Sie einen Hook zur Zählung von Instruktionen hinzu, um außer Kontrolle geratenen Code zu beenden.

local function sandboxWithLimit(code, env, maxOps)
  local ops = 0
  debug.sethook(function()
    ops = ops + 1
    if ops > maxOps then error("Instruction limit exceeded") end
  end, "", 100)
  local result = table.pack(runSandboxed(code, env))
  debug.sethook()
  return table.unpack(result, 1, result.n)
end

Sandbox testen

Schreiben Sie Tests, die bekannte Escape-Vektoren ausprobieren: Zugriff auf _G, Aufruf von load und Verwendung von debug. Stellen Sie sicher, dass sie alle fehlschlagen.

Bekannte Escape-Vektoren

Häufige Ausbruchsmöglichkeiten: string.rep("x",2^30) (Memory-DoS), ({}).__index für Standardobjekte, debug über die Metatabelle von Zeichenfolgen und io über package.loaded.

Sandbox-Frage

Warum enthält eine Sandbox nicht load oder dofile?

Zusammenfassung: Eine eingeschränkte Sandbox erstellen

Nehmen Sie in eine benutzerdefinierte Umgebungstabelle nur sichere Funktionen auf. Verwenden Sie load(code, name, "t", env). Fügen Sie mit debug.sethook eine Instruktionszählung hinzu. Testen Sie Escape-Vektoren. Nehmen Sie niemals load, dofile, debug oder den Zugriff auf die globale Tabelle auf.

Häufig gestellte Fragen

Ist die Lektion „Eine eingeschränkte Sandbox erstellen“ kostenlos?

Ja — der vollständige Text von „Eine eingeschränkte Sandbox erstellen“ 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 „Eine eingeschränkte Sandbox erstellen“?

Erstellen Sie eine sichere _ENV-Whitelist und führen Sie nicht vertrauenswürdigen Code mit load() aus 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 2 von 4.

Wie lange dauert die Lektion „Eine eingeschränkte Sandbox erstellen“?

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