Sicherheit in PHP

Dennis Wronka

Soulcollector
Wofuer ist dieser Thread gedacht:
  • Sicherheitstipps
    Also Links zum Thema eigene Ideen, Erfahrungen mit bestimmten Methoden, etc.
  • Diskussion ueber eben diese Tipps
    Es kann ja durchaus mal sein, dass hier jemand Kaese postet der sich nicht als sicher herausstellt.
  • Beispiele
    Damit meine ich z.B. ein Beispiel der Art "So sieht's haeufig aus - und so sollte es aussehen".

Wofuer ist dieser Thread nicht gedacht:
  • Fragen ob ein Script sicher ist
    Wir wollen hier eher allgemein zum Thema Sicherheit in PHP diskutieren und nicht auf spezielle Scripts eingehen. Natuerlich wollen wir hier auch Code-Beispiele sehen, aber eben nicht, dass jemand sein Script (oder einen Ausschnitt) postet und fragt ob der Code sicher ist.
Auch wenn es mir absolut widerstrebt, in diesem Thread sind zum Teil "schlimme Codes" (z.B. fopen() mit URLs) erlaubt. Hier wollen wir dafuer sorgen, dass diese sicher funktionieren, auch wenn sie nicht ueberall funktionieren weil in der php.ini bestimmte Einstellungen vorgenommen werden koennen.
Wir muessen hier im Grunde von der schlechtmoeglichsten PHP-Konfiguration ausgehen und darauf aufbauen.

Falls sich hier Tipps als absolut untauglich herausstellen werden diese entweder entsprechend markiert oder unter Umstaenden auch entfernt.

Links duerfen sowohl auf deutsche als auch auf englische Texte verweisen.

Hinweise/Aenderungsvorschlaege zu diesem Post bitte per PN an mich.
 
So, nun mal zum Thema. Vor einer Weile wurden in einem Thread schonmal ein paar Links zum Thema PHP & Security gepostet. Diese habe ich mir natuerlich erstmal alle in die Bookmark-Liste eingenaeht und werde jetzt somit einfach mal richtig gut einen ablassen... ;)
Wenn ich mich recht erinnere wurde ein nicht unbetraechtlicher Teil dieser Links "damals" (naja, so lang ist's eigentlich noch garnicht her) von Gumbo und SilentWarrior gepostet, und halt auch ein paar von mir. Falls ich bei meiner Dankesrede (ja, ich akzeptiere den Oscar fuer das mieseste Stummfilm-Drehbuch aller Zeiten ;) ) noch jemanden vergessen haben sollte, bitte hier beschweren oder fuer immer schweigen (Amen).

So, los geht's...
Web Application Security
Top7 PHP Security Blunders
PHP Foundations

Und dann gibt's natuerlich noch den Abschnitt ueber Security in der PHP-Doku
 
Zuletzt bearbeitet von einem Moderator:
Sicherheit allgemeint (nicht nur auf PHP bezogen):

a) Daten sind fies und wollen dich aufs Kreuz legen
Sämtliche Daten wollen geprüft werden. Und nicht nur jene die direkt vom Benutzer kommen. Denn auch andere Komponenten wie Datenbanken (oder die Daten darin) können kompromitiert werden und dir Lücken in das System reissen.

b) Sauberer lesbarer Programmcode hilft ungemein
Code der superkryptisch ist und mit dem man selbst gestandene Perl entwickler zur Verzweiflung bringt sind witzig und macht spass zu entwickeln. In einem Projekt das aber nicht nur zur Belustigung dient haben solche Codeteile nichts zu suchen.
Halte deinen Code einfach - verständlich und überschaubarer. Denn nur dann hast du die Möglichkeiten eventuelle Sicherheitsmängel zu entdecken.

c) Nimm dir Zeit Dinge nachzulesen.
Oft les ich das im Forum: "mach chmod 777 datei, dann funktioniert dein Code". Und jenen die solchen Rat geben gehöhrt das 5kg Unix Handbuch um die Ohren geschlagen.
RTFM (Read the *fine* manual) ist nicht immer ein schneller Rat um jemand abzuwimmeln. Manchmal ist das der einzig richtige Rat. Und in diesem Beispiel bedeutet es auch das der PHP (Perl,Python, wasweissich) Programmierer der seine Werke auf Unix/Linux laufen sehen will sich damit auseinandersetzen muss.
Gerade ein PHP Programmierer sollte dies tun, da PHP sehr stark mit Apache und Apache mit Linux/Unix verheiratet ist.
Aber nicht nur das Betriebssystem will verstanden werden. Auch Funktionen / Klassen. Und damit ist nicht nur wichtig was die Funktion offensichtlich macht. Sondern auch was eine Funktion nicht macht.
Sprich was gibt die Funktion zurück wenn etwas nicht klappt (was macht meine UrlConnection Funktion wenn der Host nicht erreichbar ist).
Nur wenn mann mögliche Probleme kennt kann mann diese behandeln und berücksichtigen.

d) Rechne immer mit dem schlimsten
Datenbanken sind nicht immer erreichbar. Die Festplatte ist sogar bei einem Hoster wenn was schiefgeht voll. Andere Programme auf dem Server können sich mal eben 99,99% Rechenzeit schnappen (Nicht nur Du und ich machen Fehler). Was ist denn aber wenn der Kunde in meinem Onlineshop seine Ware bestellt hat, der automatische Abbuchungsvorgang schon gestartet hat aber kurz bevor die Bestellungsdaten der Versandabteilung zur Verfügung gestellt wird der Server abstürzt?
Rechne auch damit, auch wenn es wohl nicht passieren wird, kann es dennoch passieren.


e) Logging ist nicht nervig sondern wichtig
Naja ok nervig ists zwar auch, was aber die Wichtigkeit nicht einschränkt. Ich nehm Bezug auf mein Beispiel Onlineshop von d).
Der dort geschilderten Fehler wird mann nicht finden. Ausser mann hat ein sauberes Logging implementiert.
Wenn sich ein Benutzer mit falschem Passwort anmeldet, muss das geloggt werden. Wenn jemand sein Passwort ändert muss das mitgeloggt werden (aber hey, dem Benutzer sein Passwort gehöhrt nicht in Klartext ins Logfile ;) ).
Nicht erreichbare Verbindungen zu Gott und die Welt müssen geloggt werden.

f) Trau dich auch mal 2-3 Tage wegzuwerfen
Ich programmiere seid vielen Jahren, und dennoch produziere ich mal wieder Code der den Anforderungen nicht gerecht wird. Entweder Fremdverschulden (unklare Anforderrungen seitens der Kunden, Projektmanager) oder aber weil mann Dinge nicht richtig aufgefasst hat, oder aber mal schlechte Tage hatte und unkonzentriert war.
Auch Programmierer sind Menschen und machen Fehler. Wenn uns auffällt das wir einen gemacht haben sollten wir Mann (und Frau ) genug sein auch mal damit zu leben grössere Codeteile komplett neu zu schreiben.
Der falsche Weg ist wenn mann mit Biegen und Brechen am Code rumfrickelt um den so anzupassen das er irgendwie doch funktioniert.
Denn in diesem Moment ist der Code: schwer wartbar und instabil.
Das sind Eigenschaften die Sicherheitslücken hervorrufen.

g) Programmiere nach den Anforderrungen und nicht nach den persöhnlichen Vorlieben
Es gibt für Programmierer nichts schöneres als die neuste Bleeding Edge Technologie auszuprobieren. Was Pre Alpha Version 0.14? Ach egal läuft - *Finger auf die Tastartur hau*
Ich mach das auch gern. In einem Projekt das aber die eigenen 4 Wände verlässt hat es nichts zu suchen wenn es auch andere Technologien gibt die die Anforderrungen gleichwertig erfüllen und dabei auch schon eine stabile Version und allgemeine Freigabe haben.

h) Stabil = sicherer, Unstabil = unsicherer
Eigentlich nochmal eine Wiederholung dessen was ich in den Punkten zuvor gepredigt habe. Systeme sind wackelig, berücksichtige es. Nur ein stabiler Code der alle Probleme die erkennbar sein können berücksichtig kann sicherer Code werden.

i) Planungen und Diagramme sind schön, aber sie sind nicht in Stein gemeisselt
Anforderrungen ändern sich. Planungen waren zu abstrakt und stellen sich falsch heraus.
Eine sauberes UML Diagramm lebt nicht davon alles und jedes im Vorneherein bedacht zu haben (das ist geradezu unmöglich, denn die Anforderrungen ändern sich nur zu gern), sondern es lebt von der Kommunikation der beteiligten Personen. Jenen die diese Diagramme aufsetzen und jenen die sie umsetzen.
Denn auch hier gilt: Setzt mann Planungen um die sich als nicht optimal heraustellen dann frickelt mann auch hier im Code herum nur um quadratisch gezeichnete Vorgaben
einzuhalten. Es resultiert: schlecht wartbarer und unstabiler Code.

j) Informier dich über Sicherheitslücken
Nicht nur das Offensichtliche (der PHP Interpreter) sondern auch weniger offensichtliche Sicherheitslücken ( IIS, Apache, Datenbank, Netzwerkdienste und weiss der Geier was noch) sind vom Interesse.
Lese auch über Ratschläge anderer betreffend Dinge die zu beachten sind bei der programmierung in der Sprache XYZ

k) ...und handel dementsprechen
Lücke PHP Interpreter? Updaten auch wenn das bedeutet das mann viel Arbeit hat um seinen Code an die neue Version anzupassen.
Der Rat Register Globals = off? Ein guter Rat der oft Arbeit nach sich zieht. Arbeit die unbeliebt ist denn nach aussen hin entwickelt sich das Projekt nicht weiter, aber der Sicherheit will genüge getan werden.

l) Lerne!
Ich bin immer am lernen. Auch wenn in meinem Profil Senior Entwickler steht heisst das noch lange nicht das ich mich auf die faule Haut legen kann.
Schau über den Tellerrand, selbst wenn das bedeutet sich mit dem "Feind" einzulassen.
So sollte jeder Java Programmierer sich auch .net anschaun, aber auch Python vielleicht Smalltalk oder gar Lisp.
Ein PHP Programmierer sollte sich auch C++ anschauen, mal anstatt MySQL einmal PostgreSQL nutzen oder gar Ruby lernen.
Was hat das mit Sicherheit zu tun? Eine ganze Menge. Mann lernt wie andere Technologien mit jenen Problemen wie Stabilität umgehen bzw können andere Sprachen auch im Umgang mit der eigenen Sprache viel beibringen.
So kann die erfahrung checked exceptions (das gezwungende Ausnahmen behandeln in Java ) den PHP Programmierer hellfen in seinem PHP Code an die Exceptions zu denken. Eine stabile Art der Programmierung auch ohne zwang vom Compiler auf seine Sprache zu transferieren.

m) ein bischen Paranoia schadet nie ;)
lass ich mal unkommentiert stehen.
 
Zurück