Sicherheit in PHP und MySQL

In den letzten Jahren tat sich viel in Sachen Sicherheit der Skripte. SQL-Injection kann man inzwischen mit ein paar Tricks fast völlig unmöglich machen. Auch GET-Variablen in PHP, eine große Sicherheitslücke, können mit ein paar Regeln fast für alles verwendet werden. Das einzige große Problem ist, auch wenn es nicht so viel mit Sicherheit zu tun hat, der Spam. Die Sicherheit eines Skriptes vor übermäßiger Nutzung ist ein breites Thema.

SQL-Injection

MySQL-Injection ist die, nach DDOS-Attacken, meines Erachtens gefährlichste Form der Attacke auf eine Website. Aber auch eine, die man leicht verhüten kann. Die Funktion mysql_real_escape_string ist eine der elementarsten Funktionen im Umgang mit SQL-Injection. Man sollte sie immer verwenden! Sie verhindert die in folgendem beschriebenen Fälle:
http://de.wikipedia.org/wiki/SQL-Injection

Auch ist es immer sinnvoll addslashes() und stripslashes() zu verwenden, sofern die Funktion magic_quotes() nicht in der php.ini aktiviert ist.

GET-Variablen

Get-Variablen sollten nie mit einem übergebenen Text arbeiten, sofern der Text weiterverarbeitet wird. Das Auslesen mithilfe einer Switch-Schleife und einer default-Anweisung bietet sich oft nützlicherweise an. Doch sollte man, sofern es geht, besser auf einen numerischen Wert umsteigen. Dieser ist leicht mit is_numeric() zu prüfen und die GET-Variable kann auch, wenn sie zu Datenbankabfragezwecken verwendet wird, ganz einfach auf einen Integer geparst werden:
(int) $_GET['meinAttribut'];
Überhaupt auf GET-Variablen sollte man verzichten, wenn es sich um eine Übergabe eines Formulars handelt. Hier kann der Benutzer mit einfachsten Kenntnissen die Überprüfung der Eingaben durch das Skript völlig umgehen.

Spam

Spam wird ein immer größeres Problem für Webdesigner. Zum einen verursacht er ungewollten Traffic (auch, wenn dieser bei kleineren Seiten kleiner ist, als bei großen, da diese in den Suchmaschinen nicht so häufig auftauchen und auch die Verlinkungen auf sie nicht so zahlreich sind) und Kommentare mit Viagra-Verkauf o.Ä. sind nicht gerade gut für die Publicity der Seite.
Lösungsansätze bieten zum einen die völlige Überprüfung aller Kommentare oder anderen Möglichkeiten für Benutzer etwas durch Formulare zu übermitteln per Hand, was aber sehr zeitaufwendig ist und von was ich selbst sehr abrate, sofern es sich durch die Größe der Website nicht gering halten lässt, oder zum anderen der Entwurf von Filtern und anderen CAPTCHA-Systemen. (Wikipedia zu Captcha) Ich rate hier zu reCaptcha oder anderen Alternativen, je nachdem, wie viel Anpassung man haben möchte, oder wie viele Funktionen man braucht. Ebenfalls ein interessanter Ansatz ist es, die Zeit, die der Benutzer für die Formulareingabe gebraucht hat, zu messen. Ca. 16 Sekunden für einen Gästebucheintrag sind angemessen. Abzuraten davon ist, wenn es sich um sogenannte „Confirm“-Buttons o.Ä. handelt, die man nur anklicken muss und man keine Zeit zum Denken braucht.

Filter

Filter können z.B. auf die Anzahl der Zeichen prüfen oder auch nach Wörtern, wie Viagra suchen. Diese können aber auch im normalen Sprachgebrauch benutzt werden, weshalb das Suchen nach solchen Wörtern nicht optimal ist und es bessere Alternativen gibt. Zum Beispiel kann man die Liste der meist benutzten Wörter in der deutschen Sprache (optional auch in einer anderen Sprache) aus Wikipedia kopieren und schließlich nach den Vorkommen dieser Wörter suchen. Ein Beispiel für eine Blogvalidierung auf Basis von diesen Vorgaben (und noch anderen Ideen), werde ich hier bald hinterlegen.

Veröffentlicht von

Alexander Kammerer

Student, Blogger, Leser. Bloc Party und Bob Dylan Enthusiast. Motto/Ästhetik: "Schönheit ist Freiheit in der Erscheinung" - Friedrich Schiller