Unsinnige Sprachkonstrukte und Funktionen in PHP?

In PHP exisitieren unheimlich viele Kontrollstrukturen und Funktionen. Klar, dass es dabei auch einiges gibt was man im Alltag eigentlich gar nicht braucht oder sauberer lösen kann oder vielleicht sogar unsinnig ist.

Mit den folgenden fünf Kontrollstrukturen musste ich persönlich noch nie arbeiten:

» Weiterlesen

5 Gefahrenquellen in PHP-Anwendungen

PHP-Anwendungen sind bekannt dafür viele Sicherheitsmängel zu beinhalten (obwohl das nicht stimmt), trotzdem möchte ich heute einmal auf 5 der schwersten Sicherheitslücken aufmerksam machen. Schaut euch doch mal eure (älteren) PHP-Skripte an. Die meisten werden mindestens eine dieser 5 möglichen Gefahrenquellen wiederfinden 😉

  1. Daten, die aus der Datenbank kommen, sind sicher
    Grundsätzlich sollte auch die Datenbank als „Benutzer“ betrachtet werden und auch hier alle eingehenden Daten überprüft werden (z.B. wenn die Daten zur Generierung von neuen PHP-Code oder dem Laden von Dateien genutzt wird).
    Der Grund ist ganz einfach: Sollte ein Unbefugter Zugriff auf die Datenbank erlangen, könnte er damit evtl. auch direkt das Verhalten der PHP-Anwendung beeinflussen.
  2. Prepared Statements oder Escaping machen SQL-Injections unmöglich
    Über Best Practices gegen SQL-Injections habe ich bereits berichtet. Es reicht nicht aus nur Spaltenwerte mit Prepared Statements zu schützen. Auch Spalten-, Tabellennamen und alles was sonst noch vom Benutzer zur Datenbank gelangt, kann eine SQL-Injection enthalten.
  3. Session IDs, die in Cookies abgelegt sind, können nicht ausgelesen werden
    Das Standard-Verzeichnis für PHP-Sessions lässt sich von jedem, der ebenfalls einen Host auf dem Server hat, auslesen – ein Kinderspiel um an die IDs der Sessions zu gelangen. Verhindern lässt sich das am besten, in dem man ständig die IP-Adresse überprüft der Session abfragt, die Session-ID jedes mal gewechselt wird (session_regenerate_id()), oder man ein anderes Verzeichnis wählt (session_save_path()).
  4. Zugangsdaten zur Datenbank werden am sichersten in einer PHP-Datei abgelegt
    Die Aussage an sich ist natürlich völlig richtig, aber was passiert wenn die Datenbank plötzlich einen Fehler meldet und die Zugangsdaten über eine unglücklich programmierte Fehlerbehandlung zu Debugging-Zwecken ausgegeben wird?
  5. Mit MD5 verschlüsselte Passwörter sind sicher
    MD5-Hashes lassen sich mittlerweile kinderleicht über Hash-Datenbanken oder Rainbow-Tables knacken. Abhilfe schaffen Salted Passwörter oder verbesserte Verschlüsselungsmethoden wie beispielsweise RSA.

Nicht alle der fünf hier genannten Punkte sind selbstverständlich und manchmal denkt man auch nicht daran, dass so etwas ausgenutzt werden könnte. Daher macht es Sinn sich einmal selbst in die Rolle des Angreifers zu versetzten und zu versuchen seine eigene Anwendung mit allen Möglichkeiten zu hacken. Immerhin kennt man sich selbst mit seinem selbstgeschriebenen Code noch am besten aus.

7 einfache Tipps zur Verbesserung von Code-Qualität

PHP ist dafür bekannt, dass es kaum Anwendungen mit qualitativ hochwertigen Code gibt. Dabei gibt es viele Tools, die dabei helfen mit relativ wenig Aufwand die Code-Qualität enorm zu steigern. Die 7 einfachsten – und meiner Meinung nach auch wichtigsten – Tipps zur Steigerung von Code-Qualität habe ich hier einmal zusammengestellt.
Auch wenn diese Tipps speziell für PHP zugeschnitten sind, kann man fast alle Tipps auch für andere Programmiersprachen anwenden.

  1. Versionskontrolle verwenden
    Tools wie Subversion oder Git helfen das Versions-Wirr-Warr bei Anwendungen besser verwalten zu können. Und wenn Fehler auftreten, lässt sich schnell eine alte Version zurückholen, oder ein Patch erstellen, der anderen Entwicklern zur Verfügung gestellt werden kann.
    http://subversion.tigris.org/
    http://git-scm.com/
  2. Unit-Tests schreiben
    Wenn man ein neue Anwendung entwickelt, dann sollte man direkt zu Beginn Unit-Tests für jede Komponente schreiben. Das spart extrem viel Zeit, wenn die Anwendung zu einem späteren Zeitpunkt erweitert oder geändert wird und nochmal getestet werden muss.
    http://www.phpunit.de/
    http://www.junit.org/
  3. Profiling
    Ab und zu macht es Sinn einmal ein komplettes Profil der Anwendung generieren zu lassen. Dabei werden alle Funktionsaufrufe aufgenommen, die Zeit festgehalten und anschließend geguckt an welchen Stellen die Anwendung zu langsam ist oder sich die Anzahl der Funktionsaufrufe optimieren lässt. Das ist ein wichtiger Faktor für die Performance-Optimierung der Anwendung.
    http://www.xdebug.org/
  4. Kommentare
    Der komplette Code sollte immer mit einheitlichen Kommentarblöcken versehen werden, die Klassen, Funktionen oder Interfaces genauer beschreiben. Das hilft nicht nur dabei eine technische Dokumentation des Codes generieren zu lassen, sondern kann auch von einigen IDEs gelesen werden und unterstützt somit die Autovervollständigung bei der Entwicklung.
    http://www.phpdoc.org/
    http://www.stack.nl/~dimitri/doxygen/index.html
  5. Einheitlicher Code (Coding Standards)
    Der Code sollte immer einem einheitlich Coding Standard folgen. Das heißt gleiche Abstände, Einrückungen, Anführungszeichen, Namenskonventionen oder Zeilenumbrüche. Dadurch lässt sich der Code von jedem Entwickler leichter lesen.
    Manchmal gibt es auch Tools, die den Code untersuchen und anschließend überprüfen ob die vorher definierten Standards tatsächlich überall eingehalten wurden.
    http://pear.php.net/package/PHP_CodeSniffer
  6. Doppelter Code
    Manchmal findet man Code-Fragmente, die sich bis auf wenige Parameter gleichen, oder die selbe Aufgabe haben. Hier sollte man unbedingt überprüfen, ob sich diese Fragmente nicht ausgelagern lassen in eine eigene Klasse oder Methode. Auch dazu gibt es wieder Tools, die solche Stellen im Code automatisiert finden können.
    https://github.com/sebastianbergmann/phpcpd
  7. Code-Trennung
    Dieser Punkt ist besonders bei Webanwendungen wichtig: Der Code von verschiedenen Sprachen sollte immer getrennt in eigenen Dateien liegen. JavaScript-Code und CSS-Anweisungen haben nichts im HTML-Quellcode zu suchen. Und bei PHP-Templates z.B. sollte darauf geachtet werden, dass diese möglichst wenig Programmlogik enthalten. Wer mag, kann auch eine Template-Engine verwenden.

Wer sich an diese Tipps hält, hat schonmal ein solides Grundgerüst für eine hohe Code-Qualität in seiner Anwendung.