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.