Signatur
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;
}
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);
// 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.