Superglobale Variablen wie z.B. $_GET
, $_POST
, $_REQUEST
, $_COOKIE
und $_SERVER
sollten immer als unsicher behandelt werden, da Sie nie genau wissen können, was in ihnen definiert wurde. Gerade die $_SERVER
Variable enthält nicht immer nur Daten über den eigentlichen Server sondern auch die übertragenen Daten des Browsers eines Benutzers.
HTTP_REFERER
Unsicher ist deshalb z.B. folgendes:
<?php
echo 'Hey Du! Du kamst gerade von der Seite ' . $_SERVER['HTTP_REFERER'];
?>
Solche Anfrage-Header können sehr einfach und über die Installation einer Browser-Erweiterung (wie Firebug) gefälscht werden.
Sicherer ist deshalb:
<?php
echo 'Hey Du! Du kamst gerade von der Seite ' . esc_url( $_SERVER['HTTP_REFERER'] );
?>
HTTP_USER_AGENT
Trauen Sie nie der $_SERVER[ 'HTTP_USER_AGENT' ]
-Variablen. Sie könnte ebenfalls gefälscht daherkommen. Behandeln Sie den Inhalt deshalb genauso wie ungefiltertes HTML:
<?php
echo 'Ihr Browser ist:' . wp_kses( $_SERVER['HTTP_USER_AGENT'], wp_kses_allowed_html() );
?>
REQUEST_URI und PHP_SELF
Beide oben genannten Variablen zeigen auf die zuletzt aufgerufene Seite. Aber vorsichtig: die Variablen übernehmen alles, was in der URL-Zeile des Browsers steht. So wird aus:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="text" name="first_name" />
<input type="submit" value="Abschicken" />
</form>
und dem Aufrufen des Scripts z.B. über die URL http://localhost/test.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cfoo%22
schonmal folgender Code:
<form action="/wpbuddy/test.php/"><script>alert('xss')</script><foo"" method="post">
<input type="text" name="first_name" />
<input type="submit" value="Abschicken" />
</form>
Dadurch wird das Javascript ausgeführt und bringt eine Meldung xss
auf den Bildschirm.
Mittlerweile werden viele dieser Techniken bereits vom Webserver so umgewandelt, dass sie keinen Schaden mehr anrichten können. Aber: das klappt nicht immer und schon gar nicht bei älteren Programmversionen. Deswegen sollten Sie vorsorgen und solchen Inhalten niemals trauen.
Wenn Sie das Formular auf die gleiche Seite leiten wollen, lassen Sie im Notfall das action
-Attribut einfach leer:
<form action="" method="post">
<input type="text" name="first_name" />
<input type="submit" value="Abschicken" />
</form>
Cookies
Sie kennen Cookies bereits. Das sind kleine Textdateien, die auf der Festplatte des Benutzers gespeichert werden. Sie dienen meist dazu, ihn wieder zu erkennen. Aber genau das macht sie unsicher. Da sie beim Benutzer gespeichert werden ist es auch möglich, den Inhalt zu bearbeiten und zu fälschen.