Start · Sprachen · PHP · Referenz · LuaSandbox

LuaSandbox

Klasse

Führt Lua-Code in einer isolierten Sandbox-Umgebung aus und ermöglicht eine kontrollierte Interaktion zwischen PHP und Lua.

seit PHP 7.0.0 Kategorie: misc

Signatur

class LuaSandbox

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
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;
HELLO WORLD Hallo, Welt!

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
Summe: 42

// 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.