Quakenet/#php Tutorial

Hinweis: Wenn sie diese Seite von einer externen URL aufgerufen haben achten sie darauf das alle Kapitel aufeinander aufbauen. Stellen sie daher sicher dass sie alle vorherigen Kapitel gelesen haben, da sie sonst relevante Informationen übersehen.

GET

  1. URL-Parameter
  2. Auslesen von GET-Variablen
  3. Gefahren von Außen

1. URL-Parameter

PHP-Skripte leben von Eingaben bzw. Daten die von Benutzer stammen. Diese Daten können über drei Wege in das Skript gelangen. Eine davon sind die URL-Parameter, auch GET-Variablen genannt. Diese Werte befinden sich in der URL und werden nach dem Pfad angegeben und mit einem ? getrennt. Beispiele für solche URLS mit GET-Variablen sind http://www.example.com/file.php?section=news oder http://www.example.com/dl.php?cat=5&id=3&view=false. Ein Anker (z.B. #top in http://www.example.com/datei.php#top) ist nicht mehr Bestandteil der GET-Variablen und wird nicht zum Server gesendet.

2. Auslesen von GET-Variablen

Alle GET-Variablen aus der URL werden in PHP im Array $_GET abgelegt. Dieses Array ist vordefiniert und auch vorhanden selbst wenn keine GET-Variablen übergeben wurden. Des Weiteren ist dies ein superglobal Array. Solche Variablen sind in jedem scope vorhanden und müssen daher nicht als Parameter an Funktionen übergeben werden. Der Name der GET-Variable dient dabei als Index für das Arrayelement im $_GET-Array. Aus der URL http://www.example.com/file.php?section=news&site=show erzeugt PHP die Arrayelemente 'section' => 'news' und 'site' => 'show'.

<?php
// bei einem Aufruf von file.php?section=news
echo $_GET['section']; // gibt 'news' aus
?>

Alle Werte der GET-Variablen sind Strings oder Arrays, selbst wenn sie z.B. nur aus Ziffern bestehen. Aus ?var=false&ID=4 wird einmal das Arrayelement mit dem Stringindex var mit dem 5 Zeichen langen String false (also kein bool(false)) und ein Arrayelement mit dem Stringindex ID mit dem 1 Zeichen langen String 4 erzeugt (also kein int(4)).

<?php
// bei einem Aufruf von file.php?var=false&ID=4
var_dump($_GET['var']); // gibt string(5) "false" aus
var_dump($_GET['ID']);  // gibt string(1) "4" aus
?>

Wenn der Name wie eine Arrayelement-Zuweisung aussieht verarbeitet PHP diese genauso. Aus ?foo[4]=bar wird im PHP-Skript $_GET['foo'][4] mit dem String bar gefüllt. Diese Technik wird häufig bei Formularen verwendet. Auch hierbei gilt dass die Werte am Ende wieder nur aus Arrays oder Strings bestehen.

3. Gefahren von Außen

Das $_GET-Array wird nur mit Variablen gefüllt die in der URL angegeben sind. Andersrum bedeutet dies auch wenn ein Wert nicht in der URL angegeben ist wird es auch nicht in $_GET erscheinen. Dies ist eine Überprüfung die in jedem Skript durchgeführt werden muss. Wenn versucht wird auf ein Arrayelement zuzugreifen welches nicht exisiert wird eine entsprechende Fehlermeldung ausgegeben.

<?php
echo $_GET['nicht_definiert'];
// Notice: Undefined index:  nicht_definiert in DATEI on line ZEILE
?>

Um so einen Fehler zu beheben könnte man einerseits einfach die Fehlermeldungen mit error_reporting ausschalten. Jedoch besser ist es wenn man vorher prüft ob externe Variablen auch vorhanden sind. Dies kann mit der isset Funktion überprüft werden.

<?php
if (isset($_GET['xyz'])) {
    echo 
"Die GET-Variable 'xyz' wurde gefunden und hat den Wert '".$_GET['xyz']."'.";
} else {
    echo 
"Es wurde keine GET-Variable 'xyz' angegeben.";
}
?>

Des Weiteren werden diese Variablen letztendlich vom Benutzer bestimmt, unabhängig davon ob er nur auf einen Link klickt oder nicht. Das heißt dass der Inhalt nicht vom PHP-Skript erstellt wurde. Dies gilt somit als Angreifpunkt. Daher sollte man externe Variablen wie GET-Variablen nie direkt ausgeben, geschweige denn als richtig oder gültig ansehen. Je nach dem was der Benutzer versucht zu hacken muss man entsprechend reagieren und prüfen. Wenn man eine Zahl erwartet, weil man z.B. einen speziellen Newsbeitrag wählen möchte (erkennbar an URLs die eine Zahl enthalten, wie z.B. show=news&newsid=5), sollte trotzdem überprüft werden ob der angegeben Wert auch wirklich eine Zahl ist. Bei Eingaben vom Benutzer die später ausgegeben werden muss überprüft werden ob sie z.B. schädlichen Javascript-Code enthalten. Solche Dinge lassen sich z.B. mit Funktionen wie htmlspecialchars entschärfen.

Fragen zum Kapitel

Keine Fragen zum Kapitel vorhanden

Zurück zu Weiter zu
Copyright © bei den OPs von #php.de/QuakeNet Valid XHTML 1.0 Strict Valid CSS!