Axel Richter: HTTP-Server Algorithmus Verhindern des Ausbrechens aus docroot

Beitrag lesen

Hallo,

Um für Schulungszwecke ServerSockets und Sockets zu demonstrieren und HTTP anzuwenden, erstelle ich gerade einen HTTP-Server mit Java. Natürlich möchte ich, obwohl der nie in den produktiven Einsatz gehen wird, auch Sicherheitsgedanken beachten. Folgendes Problem steht da zur Zeit an:

Wenn ein HTTP-Request eine Ressource anfordert:
GET http://host/abs_path
dann prüfe ich, ob das eine file-ressource im docroot ist, indem ich prüfe, ob das file(docroot + abs_path) existiert. Wenn ja, wird es ausgeliefert, wenn nein, dann wird je nach abs_path entweder ein 404 oder ein dynamisch generierter Response ausgeliefert.

Nun kann man ja allerdings
GET http://host/../../etc/file
anfordern. Angenommen, docroot wäre "/myHTTPS/wwwdocs/", dann würde das file("/myHTTPS/wwwdocs/../../etc/file") ja gefunden und ggf. ausgeliefert. Zugriffsberechtigungen und chroot-Umgebungen will ich nicht betrachten. Das Ganze soll einfach bleiben und auch unter Windows laufen.

Das Prüfen, ob "../" im abs_path vorkommt, würde helfen. Allerdings würden dann auch solche Anforderungen wie:
GET http://host/verzeichnis/../rootdoc.html
nicht mehr funktionieren. Nur zu prüfen, ob "../" am Beginn des abs_path steht, hilft auch nicht, da:
GET http://host/verzeichnis/../../../etc/file
immer noch möglich wäre.

Was ginge wäre, das File-Object zu erzeugen und dann zu prüfen, ob es im docroot liegt. Ist das die einzige Möglichkeit?

Gibt es einen allgemeingültigen Programmalgorithmus, womit man bei HTTP-Servern das Ausbrechen aus dem docroot verhinden kann, oder muss man wirklich zunächst die file-ressource referenzieren und dann vor dem Ausliefern prüfen, ob diese im docroot liegt?

viele Grüße

Axel