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