Missbrauch kommt häufiger vor, als man denkt. Oder als man bemerkt. Auch der eigene Server oder wenigstens Webspace können schnell das Ziel eines Angriffes werden, dem Missbrauch folgt.
Besonders anfällig sind Applikationen wie Foren, Blogs und Gästebücher - ganz egal in welcher Scriptsprache geschrieben. Vor Hackern sind PHP, Ruby und Perl gleich. Letztenendes liegt es in der Verantwortung eines jeden Enwicklers oder Website-Betreibers, wie er sich absichert.
Speziell zur Absicherung von Formularen gab es bereits Artikel hier im Blog (”Versteckte Daten absichern mit Tokens”) Ich denke man sollte den Sicherheitsgedanken bei PHP weiter unterstützen, daher werden noch einige Artikel dazu folgen.
Wahrscheinlich werden Entwicklungen, die im dunklen Keller zu Hause gemacht werden, weniger attackiert als Kommerzielle oder bekannte Open Source Produkte. Besonders im Trend liegt XSS (Cross Site Scripting), das oft eine Phishing- oder Dropper-Attacke einleitet.
Es gibt verschiedene Arten von XSS Attacken, man unterscheidet prinzipiell Client- und Serverseitigen Attacken (Auch als reflektiertes bzw. persistentes XSS bezeichnet). Clientseitige Attacken bestehen darin, das Code eingebettet wird, der z.B. Javascript auf der Clientseite ausführt - Für serverseitige oder persistente Attacken wird Schadcode in die Datenbank eingeschleust, der entweder die Applikation auf dem Server negativ beeinflusst oder Darstellungen von Schadcode auf der Clientseite erwirkt.
Dieser Artikel beschäftigt sich mit einer Kombination aus beidem: Häufig stehen auf Blogs und in Foren Textarea-Formularfelder für Nutzereingaben zur Verfügung, dessen Inhalt in der Datenbank abgelegt und bei anderen Usern wieder angezeit wird. Im ersten Moment ein Scheunentor, das meterweit aufsteht - wenn nicht Gegenmaßnahmen ergriffen werden.
Die einfachsten, aber effektiven Maßnahmen sind bei PHP bereits mitgeliefert:
- strip_tags - Entfernt Tags aus einer Zeichenkette
- addslashes - Entschärft alle im String enthaltenen Hochkommata durch Voranstellen von Backslashes
- htmlentities - Ersetzt alle HTML-Sonderzeichen durch HTML-Code
- mysql_real_escape_string - Ersetzt in MySQL Kommandos Hochkommata und andere Zeichen
- escapeshellcmd - Nochmal das gleiche für Shell-Kommandos die über PHP getriggert werden
Strip_tags ist eine sehr nützliche Funktion, wenn es darum geht, die zulässigen Tags zu definieren und alle anderen HTML Tags aus einem String rauszuschmeissen. Allerdings funktioniert das ganze auf Tag-Ebene - mit Attributen á la onclick und der gleichen, mit denen Javascript-Code eingeschleust werden kann, kann man jedoch viel Unsinn anstellen.
Cal Handerson hat sich zum Ziel gesetzt, diese Schwachstelle zu beseitigen und bietet mit lib_filters eine schöne Bibliothek für PHP 4 an. Die Funktion check_tags bekommt eine Whitelist für erlaubte Tags und deren Attribute zugewiesen und entfernt jeglichen Schadcode, der nicht zulässige Tags oder Attribute verwendet.
Eine Schwachstelle gibt es allerdings trotzdem: Bei einer erlaubten Tag/Attribut Kombination kann man immer noch Javascript Code einschleusen:
<a href="javascript:boeses_javascript();" mce_href="javascript:boeses_javascript();">klick mich</a>
Aber es ist super einfach, solche Dinge zu entschärfen:
$htmlcode= str_replace('javascript:', '#', $htmlcode);
Was passiert? Javascript Aufrufe werden in harmlose Anker umgewandelt und somit nicht mehr ausgeführt.

















