Signatur
Beschreibung
LuaSandbox ist eine PHP-Erweiterung, die es ermöglicht, Lua-Skripte sicher innerhalb einer abgeschotteten Umgebung auszuführen. Die Sandbox schützt das Host-System, indem sie den Zugriff auf gefährliche Lua-Funktionen (wie os, io oder require) unterbindet und Ressourcen wie CPU-Zeit und Speicherverbrauch begrenzt.
Typische Einsatzgebiete sind Anwendungen, in denen Benutzer eigene Skripte einreichen dürfen – etwa in Wiki-Plattformen (MediaWiki nutzt diese Erweiterung intensiv), Spiel-Engines oder konfigurierbaren Automatisierungssystemen. Da Lua-Code innerhalb der Sandbox keinen direkten Zugriff auf das Dateisystem oder Netzwerk hat, ist das Risiko deutlich geringer als bei der Ausführung beliebigen PHP-Codes.
Über die Klasse lassen sich PHP-Funktionen als Lua-Callbacks registrieren (registerLibrary()), Lua-Funktionen aufrufen (callFunction()) sowie globale Variablen setzen und lesen. Ressourcenlimits für CPU-Zeit (setCPULimit()) und Speicher (setMemoryLimit()) schützen vor Denial-of-Service durch bösartige oder fehlerhafte Skripte.
Voraussetzung: Die PECL-Erweiterung luasandbox muss installiert und in der php.ini aktiviert sein. Außerdem muss Lua auf dem System verfügbar sein.
Beispiele
Einfaches Lua-Skript ausführen
<?php
// Voraussetzung: PECL-Erweiterung luasandbox ist installiert
$sandbox = new LuaSandbox();
// Ressourcenlimits setzen
$sandbox->setCPULimit(1.0); // max. 1 Sekunde CPU-Zeit
$sandbox->setMemoryLimit(32 * 1024 * 1024); // max. 32 MB RAM
// Lua-Code laden und ausführen
$sandbox->loadString("result = 6 * 7")->call();
// Globale Lua-Variable auslesen
$result = $sandbox->getVariables(['result']);
echo 'Ergebnis: ' . $result['result']; // Ergebnis: 42
PHP-Funktion als Lua-Callback registrieren
<?php
$sandbox = new LuaSandbox();
$sandbox->setCPULimit(2.0);
$sandbox->setMemoryLimit(64 * 1024 * 1024);
// PHP-Funktion in Lua-Namespace einbinden
$sandbox->registerLibrary('php', [
'strtoupper' => function (string $str): array {
// Lua erwartet Rückgabewerte als Array
return [strtoupper($str)];
},
'greet' => function (string $name): array {
return ['Hallo, ' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '!'];
},
]);
// Lua-Skript ruft die registrierten PHP-Funktionen auf
$luaCode = "
local upper = php.strtoupper('hello world')
local greeting = php.greet('Welt')
return upper, greeting
";
$func = $sandbox->loadString($luaCode);
[$upper, $greeting] = $func->call();
echo $upper . PHP_EOL;
echo $greeting . PHP_EOL;
Lua-Funktion aus einem Skript aufrufen
<?php
$sandbox = new LuaSandbox();
$sandbox->setCPULimit(1.0);
$sandbox->setMemoryLimit(16 * 1024 * 1024);
// Lua-Bibliothek mit einer Funktion definieren
$sandbox->loadString("
function add(a, b)
return a + b
end
")->call();
// Lua-Funktion 'add' aus PHP heraus aufrufen
$result = $sandbox->callFunction('add', 19, 23);
echo 'Summe: ' . $result[0]; // Lua gibt Werte als Array zurück
// Wichtig · Fallstricke
Sicherheit: Obwohl die Sandbox Lua isoliert, sollte man trotzdem stets Ressourcenlimits setzen. Ohne setCPULimit() und setMemoryLimit() kann ein bösartiges Lua-Skript das System durch Endlosschleifen oder Speichererschöpfung zum Absturz bringen (Denial of Service).
Datentypen: Bei der Übergabe von Werten zwischen PHP und Lua auf Typ-Kompatibilität achten. Lua kennt nur number, string, boolean, nil und table. PHP-Arrays werden als Lua-Tables übergeben, jedoch können komplexe Objekte nicht direkt übertragen werden.
Rückgabewerte: Lua-Funktionen können mehrere Werte zurückgeben. PHP erhält diese stets als numerisch indiziertes Array, auch wenn nur ein Wert zurückgegeben wird.
Verfügbarkeit: LuaSandbox ist keine Standard-PHP-Erweiterung, sondern muss über PECL installiert werden (pecl install luasandbox). Auf Shared-Hosting-Umgebungen ist sie selten verfügbar.