Suche

Domain-Check

Mein
Merkzettel





zum Merkzettel
Zertifizierung nach DIN EN ISO 9001:2008 und DIN EN ISO 14001
Microsoft Gold Certified Partner

Was man nicht im Kopf hat,
hat man in der Datenbank.

Es geht nicht immer darum alles zu wissen,
sondern zu wissen, wo es steht.

WEB00043 - PHP: register_globals

Unsere PHP-Server sind mit register_globals = off konfiguriert. Mit dieser Einstellung deaktivieren wir die Möglichkeit, dass der Benutzer manipulierte Variablen etwa über die Adresszeile des Browsers in Ihren PHP-Code injizieren kann. Gleichzeitig werden dadurch die vom Benutzer übermittelten Variablen strikt von den internen Variablen isoliert.

Zwar erhöht dies den benötigten Konfigurationsaufwand für PHP, jedoch erhöht es die Sicherheit Ihrer PHP-Skripte enorm.

Im Folgenden nun also eine kurze Anleitung, welche Änderungen Sie an Ihren Skripten vornehmen müssen, wenn diese auf register_globals = on ausgelegt sind.

 

Hier ein kurzes Beispiel, wie ein PHP-Skript mit register_globals = off aussehen sollte:
 

undefinedundefined
if($_COOKIE['username']){
// darf nur von einem Cookie übernommen werden
$good_login = 1;
fpassthru ("/highly/sensitive/data/index.html");
}
?> 
 


Das folgende Skript demonstriert nun, welche Arten der Überprüfung Sie noch zusätzlich einbauen sollten, um die Sicherheit zu erhöhen:
 

undefinedundefinedif ($_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;
}
?>
 

Wie bei jeder Sicherheitsmaßnahme genügt natürlich die Deaktivierung von register_globals alleine nicht, um PHP-Code automatisch sicher zu machen, denn Sie sollten die vom Benutzer übermittelten Daten auf jeden Fall überprüfen lassen. Dabei ist vor allem die Initialisierung von Variablen ein wichtiger Bestandteil, denn diese lässt sich mit Hilfe von error_reporting() sehr leicht überprüfen, sodass Fehler der Stufe E_NOTICE ausgegeben werden.


Mit PHP 4.1 wurde ein neues Übergabeverfahren mit einem Satz spezieller Arrays eingeführt, die je nach der Art der Datenübergabe dem entsprechenden Array (und nur diesem) die Daten übergeben.

Die Arrays sind:
$_GET - für Formulareinträge, die mit GET, also über die URL weiter gegeben werden
$_POST - für Formulareinträge, die mit POST und somit für den Nutzer unsichtbar übergeben werden
$_COOKIE – gedacht für aus Cookies kommende Variablen
$_SERVER – nur für Servervariablen
$_ENV - für Umgebungsvariablen
$_REQUEST - speichert die per GET, POST und in COOKIES übergebenen Daten. Das ist der flexibelste Weg, die vom User übergebenen Daten einzulesen.
$_SESSION - enthält die HTTP-Session-Variablen aus den diversen Modulen


Nun bedeutet das für den Programmierer, dass eine übergebene Variable nicht automatisch global zur Verfügung steht. Also muss man, um eine Variable in ein Programm zu übernehmen, diese aus dem entsprechenden Array abholen lassen, was die Sicherheit natürlich erhöht, da immer spezifische Arrays verwendet werden müssen.


Ein Beispiel zur Verdeutlichung:


$my_hallo = $_POST["hallo"];
echo $my_hallo;
 

In diesem Fall wird also die Variable 'hallo' nur dann vom Skript übernommen und $my_hallo zugewiesen, wenn 'hallo' aus einem POST-Formular kommt – dies verhindert also effektiv Hack-Versuche über die URL.


Weitere Hinweise und Hilfen finden Sie unter folgenden Websites:
 

http://de.php.net/register_globals