O'Reilly logo

PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren by Stefan Esser, Christopher Kunz

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

22910.9 Code-Sandboxing mit runkit
10.8.9 allow_url_include
Neu seit PHP 5.2.0
Um die Probleme mit der Direktive allow_url_fopen zu lösen, wurde in
PHP 5.2.0 eine abgemilderte Variante eingeführt:
allow_url_include.
Diese Einstellung verhält sich genauso wie
allow_url_fopen, mit der
wichtigen Einschränkung, dass ausschließlich die Sprachkonstrukte
include, include_once, require und require_once betroffen sind. Damit
bietet diese Direktive eine ähnliche Funktion, wie sie die Suhosin-
Extension des Hardened-PHP-Teams schon länger implementiert.
Wie ihr älteres Gegenstück kann auch die Einstellung
allow_url_
include
auf on oder off gestellt werden, sähe also in einer php.ini-
Datei so aus:
allow_url_include = off.
10.8.10 register_globals
Eigentlich ist über diese wohl bekannteste aller Konfigurationseinstel-
lungen an anderer Stelle schon genug geäußert worden – hier soll
register_globals nur der Vollständigkeit halber erwähnt werden. Die
aus Kompatibilitätsgründen oft noch aktivierte Option dient dazu, die
eigentlich in den superglobalen Arrays
$_GET und $_POST enthaltenen
Request-Variablen in globale Variablen zu extrahieren – und dass das
bei nachlässig programmierten Skripts zu Sicherheitsproblemen führt,
ist sattsam bekannt. Von
register_globals als einer Sicherheitslücke an
sich zu sprechen, ist aber trotzdem Unsinn, auch wenn viele angebliche
Sicherheitsexperten derartige Aussagen verbreiten – nicht die Sprache
erzeugt die Lücken, sondern der Entwickler.
Seit PHP 4.2.0 und in allen Ausgaben von PHP 5 ist
register_glo-
bals standardmäßig ausgeschaltet, und das sollte es in der Regel auch
bleiben. Die große Mehrheit aller PHP-Anwendungen ist kompatibel
zu den superglobalen Request-Arrays, und neu entwickelte Projekte
sollten dies auch immer sein.
10.9 Code-Sandboxing mit runkit
Einen weiteren interessanten Ansatz verfolgt die recht neue Extension
»runkit«
3
, die unter PHP 5.1 oder neueren Versionen läuft, jedoch
Thread Safety (siehe Glossar) benötigt.
Mit dem objektorientierten Interface von runkit können Sie PHP-
Code in einer sogenannten »Sandbox«, also einer von der restlichen
PHP-Installation abgeschotteten Umgebung mit besonderen Ein-
schränkungen, ausführen. Dabei können Sie dem »PHP-Sandkasten«
3. http://pecl.php.net/package/runkit
10 PHP intern230
diverse sicherheitsrelevante Einstellungen wie den Safe Mode, open_
basedir
und deaktivierte Funktionen übergeben. PHP-Code kann dann
in der üblichen objektorientierten Notation ausgeführt werden; jede
PHP-Funktion ist nun eine Methode des instanziierten Sandbox-
Objekts.
Um die Sandbox benutzen zu können, benötigen Sie entweder PHP
5.1 oder PHP 5.0.4, das vorher mit einem speziellen Patch für Thread-
Sicherheit behandelt werden muss, und entweder Apache 1 oder 2. Sie
können die Extension entweder direkt aus PECL mit dem Kommando
pecl install runkit-beta
installieren oder sie selbst kompilieren. Dazu laden Sie das Archiv von
der PECL-Projekthomepage herunter, passen es an Ihre PHP-API-Ver-
sion an und konfigurieren und übersetzen es als dynamisch gelinktes
Modul:
PHP_PATH=/usr/local/bin
$PHP_PATH/phpize
./configure –enable-shared –-with-php-config=$PHP_PATH /php-config
make && make install
Danach fügen Sie die Extension in der php.ini hinzu:
extension=/usr/local/lib/php/extensions/no-debug-zts-
20050617/runkit.so
und können die Extension nach dem nächsten Webserver-Neustart, bei
der CGI-Version von PHP sogar sofort, benutzen.
Mit den Funktionen und Methoden der Extension können Sie nun
eine neue Sandbox erstellen und in dieser beliebigen PHP-Code aus-
führen:
Testskript für runkit
$sandbox = new Runkit_Sandbox(array('safe_mode' => 'on',
'open_basedir' => '/home/www/htdocs', 'disabled_functions' =>
'mysql_pconnect,shell_exec,passthru'));
$sandbox->testvariable = 'Test';
$sandbox->echo($sandbox->testvariable); // Test
echo $sandbox->testvariable; // auch Test
$sandbox->eval('$foo="blah"; var_dump($foo)');
Die Sandbox gibt Ihnen die Möglichkeit, Skripte oder potenziell
angreifbare Skriptteile vom Rest der Anwendung abzuschotten, ihnen
sogar ein eigenes
open_basedir zu geben und so den möglichen Schaden
durch Angriffe zu minimieren. Sie ist nicht dazu geeignet, einen zusätz-
lichen Sicherheitsmechanismus gegen böswillige Angreifer von innen
zu schaffen, aber könnte dazu verwendet werden, beispielsweise Funk-
tionen, die eventuell schädlichen Code als Parameter entgegennehmen

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required