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.