Apache gibt 404 zurück, wenn pathinfo eine teilweise URI-kodierte URL enthält

2581
Dave Sherohman

(Wow, dieser Titel ist scheiße ... Fühlen Sie sich frei, einen Vorschlag in Kommentaren zu machen oder ihn zu bearbeiten, wenn Sie einen besseren haben.)

Ich habe einen Server mit einem CGI-Programm, das eine URL als Pfadinfo erhält, die IP-Adresse des Benutzers überprüft und sie umleitet, um entweder direkt zu dieser URL zu gelangen (sofern sie intern in unserer Organisation ist) oder über einen Proxy an die URL zu senden (wenn sie extern sind). Das CGI selbst funktioniert hervorragend, aber es gibt einige URLs, für die Apache einen 404 Not Found-Fehler zurückgibt, anstatt das Skript aufzurufen. Es scheint, dass dies mit der Ziel-URL zusammenhängt, die einen URI-kodierten Pfad enthält. z.B,

http://myserver.org/cgi-bin/ipchk/http://other.server.org/10.1007%2F3-540-28519-9_8

gibt 404 zurück, während

http://myserver.org/cgi-bin/ipchk/http://other.server.org/10.1007/3-540-28519-9_8

(Dieselbe URL, aber mit a %2Fdekodiert /) funktioniert einwandfrei.

Ich habe verifiziert (durch Ausgabe error_logbeim Start), dass das ipchkSkript bei der Rückgabe von 404 überhaupt nicht gestartet wird. Diese Fehler stammen definitiv von Apache selbst und nicht aus der Umleitung von Benutzern durch das Skript an eine nicht vorhandene URL.

Warum beeinflusst die Kodierung der pathinfo-URL die Fähigkeit von Apache, das ipchk-Skript zu lokalisieren, und was muss ich tun, damit alle /cgi-bin/ipchk/ URIs übergeben werden können, ipchkunabhängig davon, was möglicherweise folgt?

1

1 Antwort auf die Frage

3
Dave Sherohman

Als Teil eines Versuchs, Benutzer vor CGI-Code zu schützen, der die Daten vor der Überprüfung eingehender Pfade nicht ordnungsgemäß decodiert, weist Apache URLs (wie 404 Not found) zurück, die die URI-codierten Formen von Schrägstrich ( %2F) oder Backslashes ( %5C) enthalten, wie erläutert in diesem Artikel .

Um diese Prüfung zu umgehen, müssen Sie Apache 2.0.46 oder höher verwenden und die AllowEncodedSlashesAnweisung in der Apache-Konfiguration aktivieren . (Diese Direktive funktioniert nicht von .htaccess; es ist nur in den Kontexten des Servers oder des virtuellen Hosts zulässig.)