Sie müssen codierte Schrägstriche in Apache zulassen


73

Ich versuche gerade, eine URL innerhalb einer URL zu platzieren. Zum Beispiel:

http://example.com/url/http%3A%2F%2Fwww.url2.com

Ich bin mir bewusst, dass ich die URL verschlüsseln muss, was ich getan habe, aber jetzt erhalte ich 404eher einen Fehler vom Server als von meiner App. Ich denke, mein Problem liegt bei Apache und kann mit der AllowEncodedSlashes OnDirektive behoben werden .

Ich habe versucht, die Direktive am Ende der httpd.conf ohne Wirkung zu platzieren, und bin mir nicht sicher, was ich als nächstes tun soll. Platziere ich es an der richtigen Stelle? Wenn ja, hat jemand andere Lösungen?


Zusätzlich zu stackoverflow.com/a/9933890/6333217 : Wenn Sie RewriteRulestattdessen verwenden ProxyPass, sollten Sie ein NEFlag hinzufügen , um eine Dekodierung zu vermeiden.
Woland

Antworten:


61

Dieses Problem hängt nicht mit dem Apache-Fehler 35256 zusammen. Es hängt vielmehr mit dem Fehler 46830 zusammen. Die AllowEncodedSlashesEinstellung wird nicht von virtuellen Hosts geerbt, und virtuelle Hosts werden in vielen Standard-Apache-Konfigurationen verwendet, z. B. in Ubuntu. Die Problemumgehung besteht darin, die AllowEncodedSlashesEinstellung in einem <VirtualHost>Container ( /etc/apache2/sites-available/defaultin Ubuntu) hinzuzufügen .

Fehler 35256 : %2Fwird in PATH_INFO dekodiert (Dokumentation AllowEncodedSlashesbesagt , dass keine Dekodierung durchgeführt wird)

Fehler 46830 : Wenn AllowEncodedSlashes Onim globalen Kontext festgelegt, wird es nicht von virtuellen Hosts geerbt. Sie müssen AllowEncodedSlashes Onin jedem <VirtalHost>Container explizit festlegen .

In der Dokumentation zum Zusammenführen der verschiedenen Konfigurationsabschnitte heißt es:

Abschnitte innerhalb von <VirtualHost>Abschnitten werden nach den entsprechenden Abschnitten außerhalb der Definition des virtuellen Hosts angewendet. Dadurch können virtuelle Hosts die Hauptserverkonfiguration überschreiben.


93

Ich bin immer wieder auf diesen Beitrag für ein anderes Problem gestoßen. Lassen Sie mich das ganz schnell erklären.

Ich hatte die gleiche Stil-URL und versuchte auch, sie zu vertreten.

Beispiel: Proxy-Anforderungen von /example/einem anderen Server.

/example/http:%2F%2Fwww.someurl.com/

Problem 1: Apache glaubt, dass dies eine ungültige URL ist

Lösung: AllowEncodedSlashes Onin httpd.conf

Problem 2: Apache dekodiert die codierten Schrägstriche

Lösung: AllowEncodedSlashes NoDecodein httpd.conf (erfordert Apache 2.3.12+)

Problem 3: mod_proxy versucht, die URL, die sich %2Fin %252F(z. B. /example/http:%252F%252Fwww.someurl.com/) ändert, neu zu codieren (doppelt zu codieren) .

Lösung: httpd.confVerwenden Sie das ProxyPassSchlüsselwort nocanon, um die unformatierte URL über den Proxy zu übergeben.

ProxyPass http://anotherserver:8080/example/ nocanon

httpd.conf Datei:

AllowEncodedSlashes NoDecode

<Location /example/>
  ProxyPass http://anotherserver:8080/example/ nocanon
</Location>

Referenz:


2
Die ersten beiden Ausgaben waren im Internet ziemlich gut dokumentiert, aber Ausgabe 3 war eine schwierige Nuss, bis ich diese Antwort sah. DANKE .
Daniel Beardsley

1
Diese Lösung hat wie ein Zauber funktioniert! das sollte die Antwort sein! danken!
Jose De Gouveia

6
Beeindruckend. Perfekte Antwort, funktioniert, prägnant. Bitte machen Sie dies zur akzeptierten Antwort.
Thomas Vander Stichele

1
Ich habe ewig gebraucht, um diese Antwort zu finden. Manchmal reicht eine Gegenstimme einfach nicht aus. Danke vielmals!
cmroanirgo

Vielen Dank dafür; genau das, was gebraucht wurde.
Ameo

32

Ich habe auch sehr viele Stunden mit diesem Problem verschwendet. Ich bin etwas spät zur Party, aber es scheint, dass es jetzt eine Lösung gibt.

Gemäß diesem Thread gibt es (gab) einen Fehler in Apache AllowEncodedSlashes On, der den 404 verhindert, aber fälschlicherweise die Schrägstriche dekodiert , was laut RFC falsch ist.

Dieser Kommentar bietet eine Lösung, nämlich zu verwenden:

AllowEncodedSlashes NoDecode

5

Angesichts all der Probleme entschied ich mich für base64_encoding, gefolgt von urlencoding. Es funktioniert, ohne mit den Einstellungen des Apache-Servers herumspielen oder Fehlerberichte anzeigen zu müssen. Es funktioniert auch, ohne die URL in den Abfragebereich einfügen zu müssen.

$enc_url = urlencode(base64_encode($uri_string));

und um es zurückzubekommen

$url = base64_decode(urldecode($enc_url));

http://example.com/admin/supplier_show/8/YWRtaW4vc3VwcGxpZXJz

http://example.com/admin/supplier_show/93/YWRtaW4vc3VwcGxpZXJzLzEwMA%3D%3D


Ich mag es nicht, aber am Ende ging es auch so
Chris

1
Hier tritt das gleiche Problem auf, da '/' ein base64-Zeichen ist.
Terje Bråten

Eine urlencodierte, /unabhängig von der Methode, um es zu machen, ist immer noch eine %2F, nicht wahr ?
William Isted

Der Top-Kommentar auf der php.net-Website für base64_encode () bietet eine gute Lösung für eine URL-sichere Version: php.net/manual/en/function.base64-encode.php#103849 Grundsätzlich wird + und / oder eine Alternative ersetzt Zeichen beim Codieren / Decodieren.
leeb

3

Nach einigem Testen und Betrachten des Fehlers in Apache bin ich zu dem Schluss gekommen, dass dies trotz angebotener Lösungen in verschiedenen Foren ein ungelöstes Problem in Apache ist. Siehe den Fehler: https://issues.apache.org/bugzilla/show_bug.cgi?id=35256

Die Problemumgehung, die für mich funktioniert, besteht darin, den URI so umzugestalten, dass sich das Element, das die maskierten Schrägstriche enthalten kann, im Abfrageabschnitt des URI anstelle des Pfads befindet. Meine Tests zeigen, dass sie dort nicht von Apache herausgefiltert werden, unabhängig von den Einstellungen AllowEncodedSlashes und AcceptPathInfo.

Damit: http://test.com/url?http%3A%2F%2Fwww.url2.com

oder: http://test.com/url?theURL=http%3A%2F%2Fwww.url2.com

anstatt: http://test.com/url/http%3A%2F%2Fwww.url2.com

Dies bedeutet eine Änderung der Architektur für unser Projekt, die jedoch unvermeidlich erscheint. Ich hoffe, Sie haben eine Lösung gefunden.


Hallo Rob. Ja, ich habe das gleiche Ergebnis erzielt und musste auch die Architekturänderung implementieren. Wenig enttäuschend, aber nur froh, dass es in dieser Phase funktioniert. Vielen Dank.
Tommizzle

3

Ersetzen Sie %2Fdurch %252Fauf der Client-Seite.

Dies ist die doppelt codierte Form des Schrägstrichs.

Wenn es den Server erreicht und vorzeitig dekodiert wird, wird es in% 2F dekodiert, was genau das ist, was Sie wollen.


2
Sie sollten niemals jede doppelte Codierung durchführen: tools.ietf.org/html/rfc3986#section-2.4
koppor

@koppor Sie können es jedoch doppelt decodieren, wenn Sie wissen, dass es doppelt codiert wurde. Sie könnten also die gesamte Komponente doppelt codieren und dann auf der anderen Seite eine zweite Decodierung für diese Komponente durchführen?
Neal Gokli

0

Ich habe das gleiche Problem mit "AllowEncodedSlashes On" und habe versucht, die Direktive an verschiedenen Stellen zu platzieren: apache2.conf, httpd.conf und in einem Abschnitt, wie in einem Beispiel unter http: //www.jampmark angegeben .com / web-scripting / 5-Lösungen-zu-URL-codierten-Schrägstrichen-Problem-in-Apache.html .

Wenn Sie dies noch nicht getan haben, möchten Sie möglicherweise Ihre Protokollierungsstufe auf Debug (eine andere Anweisung) setzen und prüfen, ob der Fehler angezeigt wird:

% 2f (codiert '/') in URI (decodiert = '/ url / http: //www.url2.com') gefunden und 404 zurückgegeben

Andere nicht gefundene Fehler geben diese Informationen nicht in den Protokollen an. Nur eine weitere Diagnose ...

Viel Glück (an uns beide)!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.