wake-up-neo.com

Unter Apache müssen codierte Schrägstriche zulässig sein

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

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 einen 404 - Fehler vom Server zurück und nicht von meiner App. Ich denke, mein Problem liegt bei Apache und kann mit der Direktive AllowEncodedSlashes On Behoben werden.

Ich habe versucht, die Direktive am Ende der httpd.conf wirkungslos zu machen, und bin mir nicht sicher, was ich als nächstes tun soll. Bringe ich es an den richtigen Ort? Wenn ja, hat jemand andere Lösungen?

66
tommizzle

Dieses Problem bezieht sich nicht auf Apache Bug 35256. Es bezieht sich vielmehr auf Bug 46830. Die Einstellung AllowEncodedSlashes wird nicht an virtuelle Hosts vererbt, und virtuelle Hosts werden in vielen Standardkonfigurationen von Apache verwendet, z Ubuntu. Die Problemumgehung besteht darin, die Einstellung AllowEncodedSlashes in einen Container <VirtualHost> (/etc/Apache2/sites-available/default In Ubuntu) einzufügen.

Bug 35256 : %2F Wird in PATH_INFO dekodiert (Dokumentation zu AllowEncodedSlashes sagt, dass keine Dekodierung durchgeführt wird)

Bug 468 : Wenn AllowEncodedSlashes On Im globalen Kontext gesetzt ist, wird es nicht an virtuelle Hosts vererbt. Sie müssen in jedem Container AllowEncodedSlashes On Explizit <VirtalHost> Setzen.

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 virtuellen Hostdefinition angewendet. Auf diese Weise können virtuelle Hosts die Hauptserverkonfiguration überschreiben.

56
Roger Dahl

Ich bin immer wieder auf diesen Beitrag gestoßen. Lassen Sie mich das ganz schnell erklären.

Ich hatte den gleichen URL-Stil und habe auch versucht, ihn als Proxy zu verwenden.

Beispiel: Proxy-Anfragen von /example/ zu einem anderen Server.

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

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

Lösung: AllowEncodedSlashes On in httpd.conf

Problem 2: Apache decodiert die codierten Schrägstriche

Lösung: AllowEncodedSlashes NoDecode in httpd.conf (Erfordert Apache 2.3.12+)

Problem 3: mod_proxy versucht, die URL neu zu kodieren (doppelt zu kodieren) und %2F bis %252F (z.B. /example/http:%252F%252Fwww.someurl.com/)

Lösung: In httpd.conf Verwenden Sie das ProxyPass Schlüsselwort nocanon, um die unformatierte URL über den Proxy weiterzuleiten.

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

httpd.conf Datei:

AllowEncodedSlashes NoDecode

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

Referenz:

76
technocrat

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

Gemäß diesem Thread gibt es einen Bug in Apache, der besagt, dass wenn Sie AllowEncodedSlashes On, verhindert das 404, dekodiert aber fälschlicherweise die Schrägstriche , was laut RFC falsch ist.

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

AllowEncodedSlashes NoDecode
31
George Armhold

angesichts all der Probleme habe ich mich für base64_encoding gefolgt von urlencoding entschieden. Es funktioniert, ohne mit den Apache-Servereinstellungen herumspielen oder Fehlerberichte lesen zu müssen. Es funktioniert auch, ohne dass die URL in den Abfrageabschnitt eingefügt werden muss.

$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

5
Kinjal Dixit

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

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

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

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

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

Dies bedeutet eine Änderung der Architektur für unser Projekt, die jedoch unvermeidlich erscheint. Hoffe du hast eine Lösung gefunden.

2
abq_rob

Ersetzen Sie %2F Auf der Clientseite durch %252F.

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.

0
Amy Neville

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.com/web-scripting/5-solutions-to-url-encoded-slashes-problem-in-Apache.html .

Wenn Sie dies noch nicht getan haben, können Sie die Protokollierungsstufe auf Debug (eine andere Direktive) setzen und prüfen, ob der Fehler angezeigt wird:

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

andere nicht gefundene Fehler enthalten diese Informationen nicht in den Protokollen. Nur eine weitere Diagnose ...

Viel Glück (an uns beide)!

0
abq_rob