Start · Sprachen · PHP · Referenz · LuaSandboxMemoryError

LuaSandboxMemoryError

Klasse

Repräsentiert einen Speicherfehler, der auftritt, wenn die LuaSandbox das konfigurierte Speicherlimit überschreitet.

seit PHP 1.0.0 Kategorie: error

Signatur

class LuaSandboxMemoryError extends LuaSandboxError

Beschreibung

LuaSandboxMemoryError ist eine Ausnahme-Klasse der PECL-Erweiterung LuaSandbox und wird geworfen, wenn ein Lua-Skript das zugewiesene Speicherlimit überschreitet. Das Speicherlimit wird beim Erstellen einer LuaSandbox-Instanz über die Methode LuaSandbox::setMemoryLimit() definiert.

Diese Klasse erbt von LuaSandboxError, welche selbst von Error erbt. Damit fügt sie sich nahtlos in die moderne PHP-Fehlerbehandlung ein und kann mit try/catch-Blöcken abgefangen werden. Das gezielte Abfangen von LuaSandboxMemoryError ermöglicht es, Speicherüberschreitungen separat von anderen Lua-Fehlern zu behandeln.

Typische Anwendungsfälle sind Umgebungen, in denen nicht vertrauenswürdiger Lua-Code sicher ausgeführt werden soll – etwa in Wiki-Systemen (z. B. MediaWiki mit dem Scribunto-Modul). Das Speicherlimit schützt den Host-Prozess vor unkontrolliertem Ressourcenverbrauch durch Lua-Skripte.

  • Speicherlimit überschritten → LuaSandboxMemoryError
  • Allgemeiner Lua-Laufzeitfehler → LuaSandboxRuntimeError
  • Syntaxfehler im Lua-Code → LuaSandboxSyntaxError

Beispiele

Speicherlimit setzen und LuaSandboxMemoryError abfangen

<?php
// LuaSandbox-Instanz erstellen
$sandbox = new LuaSandbox();

// Speicherlimit auf 1 MB setzen (in Bytes)
$sandbox->setMemoryLimit(1 * 1024 * 1024);

// Lua-Code, der sehr viel Speicher belegt
$luaCode = '
    local t = {}
    for i = 1, math.huge do
        t[i] = string.rep("x", 1024)
    end
';

try {
    $sandbox->loadString($luaCode, 'memory_test')->call();
} catch (LuaSandboxMemoryError $e) {
    echo 'Speicherfehler in Lua: ' . $e->getMessage() . PHP_EOL;
} catch (LuaSandboxError $e) {
    echo 'Allgemeiner Lua-Fehler: ' . $e->getMessage() . PHP_EOL;
}
Speicherfehler in Lua: not enough memory

Differenzierte Fehlerbehandlung nach Fehlertyp

<?php
$sandbox = new LuaSandbox();
$sandbox->setMemoryLimit(512 * 1024); // 512 KB
$sandbox->setCPULimit(5.0);           // 5 Sekunden CPU-Zeit

$scripts = [
    'valid'  => 'return 1 + 1',
    'memory' => 'local t = {} for i=1,math.huge do t[i]=string.rep("x",512) end',
    'syntax' => 'this is not lua !!@@',
];

foreach ($scripts as $name => $code) {
    try {
        [$result] = $sandbox->loadString($code, $name)->call();
        echo "[$name] Ergebnis: $result" . PHP_EOL;
    } catch (LuaSandboxMemoryError $e) {
        echo "[$name] SPEICHERFEHLER: " . $e->getMessage() . PHP_EOL;
    } catch (LuaSandboxSyntaxError $e) {
        echo "[$name] SYNTAXFEHLER: " . $e->getMessage() . PHP_EOL;
    } catch (LuaSandboxRuntimeError $e) {
        echo "[$name] LAUFZEITFEHLER: " . $e->getMessage() . PHP_EOL;
    } catch (LuaSandboxError $e) {
        echo "[$name] LUA-FEHLER: " . $e->getMessage() . PHP_EOL;
    }
}
[valid] Ergebnis: 2 [memory] SPEICHERFEHLER: not enough memory [syntax] SYNTAXFEHLER: [string "syntax"]:1: '=' expected near 'is'

// Wichtig · Fallstricke

Sicherheitshinweis: Das Setzen eines angemessenen Speicherlimits via LuaSandbox::setMemoryLimit() ist essentiell, wenn Lua-Code aus nicht vertrauenswürdigen Quellen ausgeführt wird. Ohne ein Limit kann ein Lua-Skript unbegrenzt Speicher belegen und den PHP-Prozess zum Absturz bringen.

Nach dem Auftreten eines LuaSandboxMemoryError ist der Zustand der Sandbox möglicherweise nicht mehr konsistent. Es empfiehlt sich, die Sandbox-Instanz zu verwerfen und bei Bedarf eine neue zu erstellen.

Voraussetzung: Die PECL-Erweiterung luasandbox muss installiert und in der php.ini aktiviert sein. Sie ist standardmäßig nicht Teil von PHP.