Ein Feature von PHP zur Erhöhung der Sicherheit ist die Konfiguration von
PHP mit register_globals = off.
Mit Deaktivierung der Möglichkeit, irgendeine vom Benutzer übertragenen
Variable in den PHP Code zu injizieren, können Sie die Anzahl "vergifteter"
Variablen reduzieren, welche ein potentieller Angreifer zufügen könnte.
Dieser benötigt mehr Zeit, um sich Übermittlungen auszudenken, und Ihre
internen Variablen sind effektiv von den übergebenen Benutzervariablen
isoliert.
Während dies den benötigten Aufwand mit PHP zu arbeiten leicht erhöht
ist dargelegt, dass die Vorteile gegenüber dem Aufwand klar überwiegen.
Beispiel 29-1. Mit register_globals=on arbeiten
<?php if ($username) { // kann vom User mit get/post/cookies übermittelt werden $good_login = 1; }
if ($good_login == 1) { // kann vom User mit get/post/cookies übermittelt werden fpassthru ("/highly/sensitive/data/index.html"); } ?>
|
|
Beispiel 29-2. Mit register_globals = off arbeiten
<?php if($_COOKIE['username']){ // kann nur von einem Cookie kommen $good_login = 1; fpassthru ("/highly/sensitive/data/index.html"); } ?>
|
|
Dies weise genutzt ist es auch möglich, präventive Messungen
durchzuführen, um bei versuchten Vorstößen zu warnen. Wenn Sie
im Voraus wissen, woher eine Variable kommen soll, können Sie
prüfen, ob die übermittelten Daten nicht einen unpassenden Weg
genommen haben. Obwohl dies nicht garantiert, dass Daten nicht
nur ausgedacht sind, erfordert es von einem Angreifer, auch den
richtigen Weg zu finden.
Beispiel 29-3. Entdecken einfacher Manipulationen von Variablen
<?php if ($_COOKIE['username'] && !$_POST['username'] && !$_GET['username'] ) { // Durchführen anderer Checks, ob der Benutzername gültig ist... $good_login = 1; fpassthru ("/highly/sensitive/data/index.html"); } else { mail("admin@example.com", "Possible breakin attempt", $_SERVER['REMOTE_ADDR']); echo "Security violation, admin has been alerted."; exit; } ?>
|
|
Natürlich bedeutet ein einfaches Deaktivieren von register_globals nicht,
dass Ihr Code nun automatisch sicher ist. Jeder Teil mit Daten sollte
auch auf andere Arten geprüft werden. Überprüfen Sie immer die Eingaben von
Benutzern und initialisieren Sie Ihre Variablen! Um Ihre Skripte auf nicht
initialisierte Variablen zu prüfen, können Sie
error_reporting() so einstellen, dass Fehler des Levels
E_NOTICE angezeigt werden.
Superglobals: Hinweis zur
Verfügbarkeit: Seit PHP 4.1.0 stehen superglobale Arrays wie
$_GET, $_POST,$_SERVER,
etc. zur Verfügung. Weitere Informationen können Sie dem Abschnitt zu
superglobals entnehmen.