Okay, als jemand, der sich öfters mit Security in ASP.NET befaßt ist es schon bitter zu schlucken, daß auch meine liebstes Web-Frameowork nicht gegen klassische Security-Fehltritte gefeit ist: ASP.NET hat ein Problem mit der Kanonisierung von URLs. Das hat nichts mit Musik zu tun, sondern beschreibt folgenden Sachverhalt:

Die Schreibweisen c:\dir\test.dat, test.dat, und ..\..\test.dat beziehen sich unter Umständen genau ein einziges File namens test.dat, es kommt, wie so oft, nur auf den momentanen Kontext an. Der Prozeß, wie ein Parser diese verschiedenen Schreibweisen einer identischen Angabe in eine einzige, maßgebliche Form umwandelt heißt Kanonisierung. Macht er dabei einen Fehler, hat man ein Sicherheitsproblem. Durch kreative Verwendung der Schreibweisen wird es dann nämlich einem Angreifer möglich, Schutzmechanismen zu umgehen - denn unter Umständen prüft der Parser auf eine Schreibweise und läßt keinen Zugriff auf das entprechende File zu, aber verwendet man eine andere Schreibweise, tja: dann kommt man damit durch.

Beispiel: Im Web ist Hallo Welt und Hallo%20Welt effektiv fast immer der gleiche String, da %20 eine alternative Kodierung eines Leerzeichens darstellt. Gehen wir jetzt davon aus, jemand darf nicht "Hallo Welt" eingeben. Unsere Strategie, dem Bösewicht auf die Finger zu hauen, sieht so aus:

If Eingabe="Hallo Welt" then Error

Und schon haben wir ein Problem: "Hallo%20Welt" fällt durch unser Raster, wird aber später im Programm vermutlich irgendwo zu "Hallo Welt" umgewandelt - und weiterverarbeitet. Bingo. Hätten wir die Umwandlung aller möglichen Schreibweisen schon vor der Prüfung durchgeführt (und dabei keine Fehler gemacht) dann wäre unsere Prüfung wasserdicht. Leider ist das Ganze nicht so einfach wie es aussieht. Denn manchmal ist es gar nicht so einfach, zu erkennen wieviele alternative Darstellungsmöglichkeiten es eigentlich gibt, besonders wenn vor- und nachgeschalteter Programmcode, oft gar nicht unter eigener Kontrolle, böse dazwischenfunkt.

Also: Wer selber ohne Kanonisierungsprobleme ist, der werfe den ersten Stein. Statt Steinewerfen empfiehlt es sich aber meistens sowieso, sofort Gegenmaßnahmen einzuleiten.