Start · Sprachen · PHP · Referenz · LuaSandboxError

LuaSandboxError

Klasse

Basisklasse für alle Fehler, die von der <code>LuaSandbox</code>-Extension geworfen werden.

Kategorie: error

Signatur

class LuaSandboxError extends Error

Beschreibung

LuaSandboxError ist die gemeinsame Basisklasse aller Ausnahmen und Fehler, die von der LuaSandbox-Extension ausgelöst werden. Sie erweitert die eingebaute PHP-Klasse Error und ermöglicht so das gezielte Abfangen aller LuaSandbox-spezifischen Fehler in einem einzigen catch-Block.

Die Klassenhierarchie der LuaSandbox-Extension besteht aus mehreren spezialisierten Unterklassen wie LuaSandboxFatalError, LuaSandboxRuntimeError, LuaSandboxSyntaxError und LuaSandboxTimeoutError, die alle von LuaSandboxError erben. Damit lässt sich feingranular auf verschiedene Fehlerarten reagieren, ohne auf alle anderen PHP-Fehler verzichten zu müssen.

Typischerweise fängt man zunächst die spezifischsten Unterklassen ab und verwendet LuaSandboxError als letzten Fallback für alle sonstigen LuaSandbox-Fehler. Dies ist besonders hilfreich, wenn Lua-Code aus nicht vertrauenswürdigen Quellen ausgeführt wird, da die Sandbox-Umgebung verschiedenartige Fehler erzeugen kann.

Beispiele

Gezieltes Abfangen von LuaSandbox-Fehlern

<?php
$sandbox = new LuaSandbox();
$sandbox->setMemoryLimit(50 * 1024 * 1024);
$sandbox->setCPULimit(1.0);

try {
    // Syntaktisch ungültiger Lua-Code
    $sandbox->loadString('this is not valid lua code =!!');
} catch (LuaSandboxSyntaxError $e) {
    echo 'Lua-Syntaxfehler: ' . $e->getMessage() . PHP_EOL;
} catch (LuaSandboxRuntimeError $e) {
    echo 'Lua-Laufzeitfehler: ' . $e->getMessage() . PHP_EOL;
} catch (LuaSandboxTimeoutError $e) {
    echo 'Lua-Timeout: ' . $e->getMessage() . PHP_EOL;
} catch (LuaSandboxError $e) {
    // Fängt alle anderen LuaSandbox-Fehler ab
    echo 'Allgemeiner LuaSandbox-Fehler: ' . $e->getMessage() . PHP_EOL;
}
Lua-Syntaxfehler: ...

Alle LuaSandbox-Fehler zentral behandeln

<?php
function executeLuaSafely(string $luaCode): mixed
{
    $sandbox = new LuaSandbox();
    $sandbox->setMemoryLimit(16 * 1024 * 1024);
    $sandbox->setCPULimit(0.5);

    try {
        [$result] = $sandbox->loadString($luaCode)->call();
        return $result;
    } catch (LuaSandboxError $e) {
        // Zentrales Logging aller LuaSandbox-Fehler
        error_log(
            sprintf(
                'LuaSandbox-Fehler [%s]: %s',
                get_class($e),
                $e->getMessage()
            )
        );
        return null;
    }
}

$result = executeLuaSafely('return 2 + 2');
var_dump($result);

$result = executeLuaSafely('invalid lua !!');
var_dump($result);
int(4) NULL

// Wichtig · Fallstricke

Sicherheitshinweis: LuaSandbox ist dafür ausgelegt, nicht vertrauenswürdigen Lua-Code sicher auszuführen. Dennoch sollten Speicher- und CPU-Limits (setMemoryLimit() und setCPULimit()) stets gesetzt werden, um Denial-of-Service-Angriffe zu verhindern. Fehler beim Überschreiten dieser Limits werden als LuaSandboxTimeoutError bzw. eigene Fehlerklassen signalisiert, die alle von LuaSandboxError erben.

Erweiterung notwendig: Die LuaSandbox-Extension ist nicht standardmäßig in PHP enthalten und muss separat über PECL installiert werden (pecl install luasandbox). Die Klassen stehen daher nur zur Verfügung, wenn die Extension geladen ist.