php.de

Zurück   php.de > php.de Intern > Beitragsarchiv

Beitragsarchiv Nur gucken, nichts anfassen. Das Archiv der Beiträge vergangener Zeiten.

 
 
LinkBack Themen-Optionen
Alt 15.11.2004, 08:50  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard Was heißt eigentlich "register_globals=ON/OFF"?

Das Tutorial wurde geschrieben von: fantast

--------------------------------

register_globals ist eine Direktive, die in der Konfigurationsdatei
von PHP, php.ini, verwendet wird und das Verhalten von PHP zu
externen Variablen, genauer gesagt, Daten die im HTTP-Request
mitgeschickt wurden, regelt. Bei diesen externen Variablen handelt es
sich um:

1. GET-Daten: Variablen, die ans Ende der URL angehangen werden
(Bsp.: http://www.phpfriend.de/forum/viewforum.php?f=2).
2. POST-Daten: Variablen, die mit Hilfe des POST-Feldes in einem
HTTP-Request an den Server übergeben werden.
3. Cookies: Ähnlich wie POST-Daten werden auch Daten aus Cookies mit
dem HTTP-Request an den Server übergeben.
4. Session-Daten: Alle Variablen die in einer Session gespeichert werden.
5. Umgebungsvariablen: Alle Variablen, die auf dem Server als
Umgebungsvariablen registriert sind.

Wenn register_globals auf "on" gestellt ist, so wie das bei allen
PHP-Versionen vor 4.1.0 standardmässig der Fall war, werden all diese
Variablen direkt registriert. Das heisst man kann dann einfach über den
Variablennamen auf sie zugreifen. Beispiel:
Zitat:
Request an den Server: GET /index.html?list=1
Hier wird per GET eine Variable mit an den Server übergeben, die
Variable "list". Sie hat den Wert "1". Innerhalb des Scriptes ist sie als
$list zu sehen, kann ausgelesen und verändert werden.
Das Gleiche funktioniert mit allen anderen externen Variablentypen. Auf
den ersten Blick scheint dieses Verhalten sehr sinnvoll, sind doch
sämtliche Variablen im Script direkt verfügbar. Leider tun sich durch diese Möglichkeit riesige Sicherheitslücken auf, die nur mit grösster Sorgfalt
und unverhältnismässigem Aufwand gestopft werden könnten. Beispiel:
PHP-Code:
if (!isset($autorisiert)) {
  
$autorisiert check_user();
}

if (
$autorisiert) {
  echo 
"Sie sind autorisiert !";
} else {
  echo 
"Sie haben keinen Zugriff !";

Die Funktion check_user() würde überprüfen, ob der User zum
Zugriff berechtigt ist. Mit register_globals on wäre folgende Attacke möglich:
Zitat:
HTTP-Request: GET /privat.php?autorisiert=true
Die Variable $autorisiert wird ausserhalb des Scriptes definiert, und
steht daher auch im Sciprt zur Verfügung. Daher wird die Funktion
check_user() überhaupt nicht ausgeführt. Und da die Variable
ausserhalb des Scriptes auf "true" gesetzt wurde, ist sie es innerhalb des
Scriptes auch, man hat also mit einfachsten Mitteln den Sicherheitstest
umgangen.

Beispiel 2:
PHP-Code:
session_start();
if (
$username == "admin") {
  echo 
"Autorisiert !";
} else {
  echo 
"Nicht autorisiert !";

Hier wird zunächst eine Session gestartet, und dann angenommen, dass
die Variable $username aus den Session-Daten geladen wird. Wenn
man jetzt aber wie im ersten Beispiel wieder per GET den String
?username=admin hinten an die URL hängt, wird die Variable
$username im Script auch den Wert "admin" haben, auch wenn der
User sich noch gar nicht eingeloggt hat, geschweige denn wirklich der
Administrator ist.

Da genau solche Dinge passieren können und passieren, wurde, wie oben
erwähnt, register_globals ab Version 4.1.0 auf "off" gesetzt. Das
heisst allerdings, dass es auch wieder aktivieren kann, hiervon soll
allerdings dringendst abgeraten sein.

Die neue, bevorzugte und deutlich sichere Methode auf externe Variablen
zuzugreifen ist der Weg über die Superglobals. Es gibt für jeden der
fünf externen Variablentypen ein Array, welches beim Start des Scriptes
automatisch definiert und mit den entsprechenden Daten gefüllt wird. Diese Arrays heissen:
für GET-Daten: $_GET
für POST-Daten: $_POST
für Cookies: $_COOKIE
für Session-Daten: $_SESSION
für Umgebungsvariablen: $_ENV

Desweiteren gibt es noch das Array $_REQUEST, welches die drei
Arrays $_GET, $_POST und $_COOKIE in einem vereint,
$_SERVER, welches Informationen über den Server liefert und
$_FILES, welches Dateien beinhalten, welche per POST an den
Server übertragen worden sind, wie das zum Beispiel bei Formularen der
Fall sein kann.

All diese Arrays haben den Zweck die oben aufgezeigte Sicherheitslücke
zu stopfen, indem sie externe Variablen nicht mehr einfach sichtbar
machen, sondern in ein Array "verpacken". Sie heissen Superglobals, da
sie immer verfügbar sind, Egal aus welchem Kontext auf sie zugegriffen
wird.

Das erste Beispiel also wäre nun sicher, da die per GET übergebene
Variable nun $_GET['autorisiert'] heissen würde, und daher nicht
mehr die eigentliche Variable überschreiben würde. Das zweite Beispiel
müsste angepasst werden:
PHP-Code:
session_start();
if (
$_SESSION['username'] == "admin") {
  echo 
"Autorisiert !";
} else {
  echo 
"Nicht autorisiert !";

Jetzt könnte man sichergehen, dass tatsächlich die Variable, die aus den
Session-Daten eingelesen wurde, überprüft wird.

Ich hoffe das hat gereicht um einen Einblick in das Wie und Wieso hinter
register_globals und die damit verbundene Problematik zu
gewähren. An dieser Stelle noch einige Links die sich mit der selben
Thematik beschäftigen:
http://www.php.net/manual/de/security.globals.php
http://www.php-faq.de/q/q-fehler-variable.html

Danke fürs Lesen
fantast
imported_Ben ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

 


Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
was heißt on, was heißt off, was heisst on, was bedeutet off, was heist on, was heißt off auf deutsch, was heisst off, was heist off, was heißt on und off, was bedeutet register_globals, was heißt off und on, was heißt ons, off heißt, was heißt on off, was heißt on?, was bedeutet on und off, was heißt o.n., was heisst register_globals, was heisst off auf deutsch, was bedeutet on oder off

Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.