W-JAX: Secure Coding

Maßnahmen und Anregungen übernommen bzw. abgeleitet aus dem gleichnamigen Vortrag von Bruce Sams

Vermeide Random, verwende stattdessen SecureRandom

Random ist nicht wirklich zufällig, wenn zwei aufeinanderfolgende Zufallszahlen bekannt sind, können alle weiteren erraten werden. Dumm nur, wenn ein Hacker darauf spekulieren kann …

Vertraue keiner externen Quelle, insbesondere keinen Eingaben des Anwenders

Im einfachsten Fall sprechen wir von Texteingaben, es betrifft aber RSS-Feeds, Emails usw. Nach Analyse von (öffentlichen) Sicherheitsmeldungen konnte ein schlauer Mensch ca. 60% der Fehlfunktionen auf fehlende Überprüfung der Eingabe klassifizieren – vielleicht mag ja jemand mal die Quelle nachreichen. Aus der Erfahrung von Bruce Sams heraus können die meisten Sicherheitsprobleme in Webanwendungen dem Datenfluss zugeordnet werden, genauer der ungenügenden Validierung von Eingaben und anderen externen Quellen. Das deckt sich mit meiner Erfahrung, dass die meisten Probleme in Webanwendungen durch „komische“ Eingaben erzeugt werden.

Lösung: Versuche möglichst nicht, die Daten im nachhinein zu validieren, sondern bestimme genau, was zulässig ist, und was nicht. Was an der Oberfläche abgefangen werden kann, sollte da auch abgefangen werden. Vertraue der Oberfläche aber nicht bedingungslos, genau die kann in Webanwendungen manipuliert werden.

Überprüfe Deinen Code

Die offensichtlichsten Probleme im Code lassen sich auch durch statische Analyse finden. Bevor also eine umfassende Datenflussanalyse durchgeführt wird, oder zumindestens ganz wilde Eingabetests, lasse Tools wie FindBugs und JDepend auf den Code los. Ich selber mag z.B. auch Checkstyle sehr gerne.

Ergänze dies durch JUnit-Tests, und zwar mit zufälligen Eingaben, mit Überprüfung der offensichtlichen Grenzbereiche (wie z.B. gar keine Eingabe und überlange Eingabe), sowie mit allen behobenen Fehlerfällen. Wichtig: Jeder behobene Fehler sollte wirklich in einem JUnit-Test landen, sonst kommt er irgendwann einmal wieder.