// der php hacker

// archiv

10 Tipps für sichere Software

Geschrieben am 31. Jan 2009 von Cem Derin

locks_headline

Wie zuvor schon am letzten Tag des Monats 10 nützliche Tipps für Anfänger und Fortgeschrittene. Heute mit Augenmerk auf Sicherheit. Speziell für PHP-Anwendungen, aber ein paar Hinweise lassen sich auch generell mitnehmen.

1. PHPIDS

PHPIDS ist eine Intrusion Detection Software für PHP-Anwendungen. Ich setze PHPIDS schon länger ein und bin höchst zufrieden. Nicht zuletzt, weil Mario und sein Team Anfragen und Bugfixes teilweise innerhalb weniger Minuten abarbeiten. Hier sei jedoch noch erwähnt: PHPIDS erkennt mögliche Angriffe. Verhindern muss man sie selbst.

2. Typsicherheit

Stellen wir ein klar: Typsicherheit in PHP gibt es nicht. Aber es gibt Möglichkeiten, den Effekt zu erzielen. Ansätze gibt es da mehrere: “Alles ist eine Klasse” und ein kleiner Hack unter Zuhilfenahme eines eigenen Error-Handlers sind nur zwei davon. Wichtig ist nur, dass bestimmte Datentypen erwartet werden, wenn der Benutzer Daten reinschickt. Das nennt men dann …

3. Never trust incoming data

Im Grunde Basiswissen: Alles was vom Anwender kommt, könnte böse sein. Oftmals weiß der User nicht einmal, dass er grade schädliche Daten reinschickt. Aus diesem Grund müssen Benutzerdaten immer dahingehend geprüft werden, ob sie Tatsächlich in dem Format ankommen, in dem man sie erwartet. Und weil ich immer wieder darüber stolper: is_numeric würde auch +0.45e6 durchlassen. Lieber is_int verwenden (wenn der Effekt gewünscht ist).

4. Die early

Ähnlich dem schon vorgestellten Prinzip beim erstellen von Software bezeichnet das “frühe Sterben” in puncto Sicherheit, dass man so viele Fehler wie möglich anzeigen lässt. Konkret: Error Level voll aufdrehen! Nicht deklarierte Variablen, nicht vorhandene Indizies und ähnliches können zu unerwartetem Verhalten innerhalb des Programmflusses führen. Da man nicht alle Kombinationen abfangen kann, sollte man Variablen/Arrays immer als solche Instanzieren.

5. Sicherheitsmaßnahmen vorsichtig, dafür richtig dosieren

Nicht selten sieht man in Panik geratene Anfänger (oder sich für Profis haltende Anfänger) die alle möglichen Check- und Entschärfungsfunktionen die PHP so mitbringt auf alles anwenden, was vom Benutzer reingeschickt wird. Das führt in erster Linie dazu, dass die Daten in der Regel unbrauchbar abgespeichert werden und nur durch ebensoviele Umkehrroutinen wieder ausgegeben werden können und zum anderen, dass man meist nur Datenbankoperationen (halbwegs) absichert.

Lieber verstehen, was man da macht, statt alles was man zu dem Thema findet anzuwenden, ohne einen geringsten Schimmer von Auswirkungen zu haben.

6. Up to date bleiben

Unglaublich aber wahr: das ist gar nicht mal so selbstverständlich. Softwarekomponenten von Drittanbietern müssen immer aktualisiert werden. WordPress zum Beispiel weist beim anmelden im Backend unübersehbar darauf hin, dass eine neue Version bereit steht, wenn das der Fall ist. Aber auch jede andere Software bietet Mailing-Listen, RSS-Feeds oder andere Benachrichtigungsoptionen an, um zu erfahren, wenn kritische Lücken gestopft wurden oder einfach nur ein Update verfügbar ist.

Ich habe schon in Unternehmen arbeiten müssen, in denen die Philosophie vorherrschte, dass man immer die vorletzte Version verwendet. Die letzte wäre ja zu unausgereift. Diese Einstellung kann ich weder teilen noch empfehlen. Klar muss einem nur sein, dass Softwareprojekte in der Regel in mehreren Major-Versionen gepflegt werden. Nutzt man Beispielswiese die Version 4.7.1 einer Software und es erscheint 4.7.2, so sollte man aktualisieren. Erscheint nun aber 5.1.0 RC (für Release Candidate) so sollte jedem halbwegs intelligenten Softwareentwickler und jedem Pflichtbesuwssten Systemadministrator klar sein, dass hier i.d.R. kein Handlungsbedarf besteht.

7. Suhosin

Suhosin exisitert sowohl als Patch für den PHP-Kern, als auch als Modul zum dynamischen hinzufügen. Es sorgt für die Abdichtung von bekannten und derzeit noch unbekannten PHP-Schwächen und -Lücken. Selbst ohne Konfiguration greifen bereits diverse Sicherheitsmechanismen wie zum Beispiel Session-Encryption. Es ist also empfohlen diese unkomplizierte Extension auf jedem PHP-Server zu installieren.

8. Struktur verbergen

Um nicht zu viel von seiner Applikation preis zu geben, sollte man seine Struktur verschleiern. Zum einen macht es durchaus Sinn, Rewrite-Pfade zu benutzen, um den Benutzer nicht daraus hinzuweisen, um was es sich für eine Sprache handelt, in der die Seite verfass ist. Fehlermeldungen sollte grundsätzlich im Live-Betrieb nicht ausgegeben werden. Trotzdem muss man sich immer vor Augen halten, dass das alleine noch kein Schutz ist. Jemand, der wirklich angreifen will, der wird experimentieren. Ob es sich um PHP handelt ist recht schnell ermittelt: Einfach mal das hier an eine URL hängen “?=PHPE9568F36-D428-11d2-A769-00AA001ACF42″.

9. Struktur schützen

Include-Pfade sollten außerhalb des Webroots liegen. Konfigurationsdateien erst recht. Im Webroot gehört die index-Datei, die jeden Programmaufruf steuert sowie alles was zur Anzeige nötig ist bzw. was der Browser dafür braucht: CSS, JS, Grafiken, etc. Der Rest: Außerhalb dem Sichtbereich neugieriger Augen.

10. Abläufe verstehen

Das Wichtigste ist, dass man versteht wie Dinge funktionieren. Was ist ein Header? Wie ist dieser aufgebaut. Was könnte mit einem Header angestellt werden, wenn ich ein Kontaktformular nicht ordentlich absichere. Wie wird ein Benutzer mit einer Session in Beziehung gebracht? Wo werden die Sessiondaten abgelegt? Was hat das für Auswirkungen in Shared Webserver Umgebungen? Das sind wieder eine Reihe Sicherheitsrelevanter Fragen deren Beantwortung hier den Rahmen sprengen würden. Würde man aber wissen, wie PHP, das HTTP-Protokoll oder der Server bzw. der Client sich verhält, so könnte man sich die meisten Fragen selbst beantworten. Des wegen mein letzter Typ: Bringt in Erfahrung, wie Dinge funktionieren.

Foto von Marc Palmer & Christine Burke

Geschrieben in Entwicklung 4 Kommentare

#001
31. Jan 2009
Pekka

Mmm, eine sehr schöne Übersicht! Gute Arbeit.
Einen Link dazu sollte man eigentlich als Sticky auf der PHP-Resource unterbringen.


#002
02. Feb 2009
Flo

Hey,

gute Zusammenfassung. :-)


#003
02. Feb 2009
unset

@Pekka: Verlink doch! Hindert dich keiner ;-)

@Flo: Danke für die Blumen. Ein paar Sachen hatte ich über den Januar zusammengetragen, das meiste kam dann aber von Freitag auf Samstag ;-)


#004
23. Apr 2009

Ganz nützliche Hinweise!

zu Punkt 8:
das kann man durch die PHP Einstellung expose_php = Off aus schalten.
Zusätzlich verhindert es auch das mitsenden des Headers “X-Powered-By: PHP x.x.x”, was sogar die einfachere Möglichkeit ist PHP + die Version zu erkennen.

Beispiel spiegel.de
X-Powered-By: Servlet 2.4; JBoss-4.0.3SP1 (build: CVSTag=JBoss_4_0_3_SP1 date=200510231054)/Tomcat-5.5

;)

// kommentieren

// senden
theme von mir, software von wordpress, grid von 960 grid system. funktioniert in allen browsern, aber der safari bekommt das mit der schrift am schönsten hin.