Entspricht einem Schrägstrich ("/") einem codierten Schrägstrich ("% 2F") im Pfadbereich einer HTTP-URL

74

Ich habe eine Site, die "/" und "% 2F" im Pfadabschnitt (nicht in der Abfragezeichenfolge) einer URL unterschiedlich behandelt. Ist das eine schlechte Sache, entweder nach RFC oder nach der realen Welt?

Ich frage, weil ich immer wieder auf kleine Überraschungen mit dem von mir verwendeten Webframework (Ruby on Rails) und den darunter liegenden Ebenen stoße (Passenger, Apache, z. B. musste ich "ALLOW_ENCODED_SLASHES" für Apache aktivieren). Ich neige jetzt dazu, die codierten Schrägstriche vollständig zu entfernen, aber ich frage mich, ob ich Fehlerberichte einreichen sollte, bei denen ich ein seltsames Verhalten bei den codierten Schrägstrichen sehe.

Grundsätzlich habe ich Routen wie diese, warum ich die codierten Schrägstriche überhaupt habe:

:controller/:foo/:bar

Dabei gilt: foo ist so etwas wie ein Pfad, der Schrägstriche enthalten kann. Ich dachte, das Einfachste wäre, nur die URL zu maskieren, foodamit die Schrägstriche vom Routing-Mechanismus ignoriert werden. Jetzt habe ich Zweifel und es ist ziemlich klar, dass die Frameworks dies nicht wirklich unterstützen, aber laut RFC ist es falsch, dies so zu tun?

Hier sind einige Informationen, die ich gesammelt habe:

RFC 1738 (URLs):

Normalerweise hat eine URL dieselbe Interpretation, wenn ein Oktett durch ein Zeichen dargestellt wird und wenn es codiert ist. Dies gilt jedoch nicht für reservierte Zeichen: Das Codieren eines für ein bestimmtes Schema reservierten Zeichens kann die Semantik einer URL ändern.

RFC 2396 (URIs):

Diese Zeichen werden als "reserviert" bezeichnet, da ihre Verwendung innerhalb der URI-Komponente auf ihren reservierten Zweck beschränkt ist. Wenn die Daten für eine URI-Komponente mit dem reservierten Zweck in Konflikt stehen würden, müssen die widersprüchlichen Daten vor dem Bilden des URI maskiert werden.

(Bedeutet Flucht hier etwas anderes als das Codieren des reservierten Zeichens?)

RFC 2616 (HTTP / 1.1):

Andere Zeichen als die in den "reservierten" und "unsicheren" Sätzen (siehe RFC 2396 [42]) entsprechen ihrer ""% "HEX HEX" -Codierung.

Es gibt auch diesen Fehlerbericht für Rails, in dem sie zu erwarten scheinen, dass sich der codierte Schrägstrich anders verhält:

Richtig, ich würde unterschiedliche Ergebnisse erwarten, da sie auf unterschiedliche Ressourcen verweisen.

Es wird nach der Literaldatei 'foo / bar' im Stammverzeichnis gesucht. Die nicht maskierte Version sucht nach der Dateiliste im Verzeichnis foo.

Aus den RFCs geht hervor, dass Raw vs. Coded das Äquivalent für nicht reservierte Charaktere ist. Aber wie sieht die Geschichte für reservierte Charaktere aus?

user85509
quelle
Siehe auch
unor
PHP-Benutzer, die einen Front-Controller verwenden: $ _GET & $ _REQUEST sind bereits urldecodiert. Dies kann zu Problemen mit Schrägstrichen führen, da Sie nicht erkennen können, was ein Schrägstrich und was ein% 2F war. Wenn Sie die Anfrage unbedingt so sehen müssen, wie sie gesendet wurde, schauen Sie in $ _SERVER ['REQUEST_URI'] nach. Siehe auch urldecode()@php.net
Patrick James McDougle
In Verbindung stehender Beitrag - Wie man einen Backslash mit R / RCurl URL codiert
RBT

Antworten:

34

Aufgrund der von Ihnen gesammelten Daten würde ich eher sagen, dass das in einem Uri codierte "/" auf Anwendungs- / CGI-Ebene wieder als "/" angesehen werden soll.

Das heißt, wenn Sie beispielsweise Apache verwenden, stimmt mod_rewritees nicht mit dem Muster überein, das Schrägstriche gegen URI mit codierten Schrägstrichen erwartet. Sobald jedoch das entsprechende Modul / cgi / ... aufgerufen wird, um die Anforderung zu verarbeiten, muss es die Dekodierung durchführen und beispielsweise einen Parameter mit Schrägstrichen als erste Komponente des URI abrufen.

Wenn Ihre Anwendung diese Daten dann zum Abrufen einer Datei verwendet (deren Dateiname einen Schrägstrich enthält), ist dies wahrscheinlich eine schlechte Sache.

Zusammenfassend finde ich es völlig normal, einen Unterschied im Verhalten in "/" oder "% 2F" zu sehen, da ihre Interpretation auf verschiedenen Ebenen erfolgen wird.

Zeograd
quelle
1
Das ist so ziemlich das, was ich auch gedacht habe. Leider sieht es so aus, als gäbe es in der realen Welt nicht viel Unterstützung dafür. Ich werde vorerst weiterarbeiten, aber wenn ich von vorne anfangen würde, würde ich einen anderen Fluchtmechanismus ausprobieren.
user85509
@ user85509 Ich frage mich, ob ich Fehlerberichte einreichen soll, bei denen ich seltsames Verhalten mit den codierten Schrägstrichen sehe. - Bitte tun Sie dies jedes Mal, wenn Sie ein Verhalten beobachten, das nicht mit dem RFC übereinstimmt, in dem eindeutig angegeben ist, dass sich /ein reserviertes Zeichen von seiner prozentual codierten Form unterscheidet %2F.
Piotr Dobrogost
25

Die Geschichte von %2Fvs /war, dass nach den anfänglichen W3C-Empfehlungen Schrägstriche «eine hierarchische Struktur implizieren müssen» :

Der Schrägstrich ("/", ASCII 2F hex) ist für die Abgrenzung von Teilzeichenfolgen reserviert, deren Beziehung hierarchisch ist. Dies ermöglicht Teilformen des URI.

Beispiel 2

Die URIs

http://www.w3.org/albert/bertram/marie-claude

und

http://www.w3.org/albert/bertram%2Fmarie-claude

sind NICHT identisch, da im zweiten Fall der codierte Schrägstrich keine hierarchische Bedeutung hat.

Yury Kirienko
quelle
Was ist mit Anfragen? Eine Abfrage hat keine hierarchische Struktur. Sie sind nur Variablen. Es ist kleinlich, dass es nicht durch die W3C-Empfehlung erklärt wird.
Eksapsy
9

Ich habe auch eine Seite, die zahlreiche URLs mit urlencodierten Zeichen enthält. Ich stelle fest, dass viele Web-APIs (einschließlich Google Webmaster-Tools und mehrerer Drupal-Module) über urlencodierte Zeichen stolpern. Viele APIs dekodieren URLs zu einem bestimmten Zeitpunkt automatisch und verwenden das Ergebnis dann als URL oder HTML. Wenn ich eines dieser Probleme finde, codiere ich normalerweise die Ergebnisse (wodurch% 2f in% 252f umgewandelt wird) für diese API doppelt. Dadurch werden jedoch andere APIs beschädigt, die keine doppelte Codierung erwarten. Dies ist also keine universelle Lösung.

Persönlich werde ich so viele Sonderzeichen in meinen URLs wie möglich entfernen.

Außerdem verwende ich in meinen URLs ID-Nummern, die nicht von der URL-Codierung abhängen:

example.com/blog/my-amazing-blog%2fstory/yesterday

wird:

example.com/blog/12354/my-amazing-blog%2fstory/yesterday

In diesem Fall verwendet mein Code nur 12354, um nach dem Artikel zu suchen, und der Rest der URL wird von meinem System ignoriert (wird jedoch weiterhin für SEO verwendet). Außerdem sollte diese Nummer VOR den nicht verwendeten URL-Komponenten angezeigt werden. Auf diese Weise funktioniert die URL auch dann noch, wenn% 2f falsch dekodiert wird.

Stellen Sie außerdem sicher, dass Sie kanonische Tags verwenden, um sicherzustellen, dass URL-Fehler nicht zu doppelten Inhalten führen.

Hoytman
quelle
Diese Methode scheint für reddit.com ziemlich gut zu funktionieren.
StockB
2

Was tun, wenn :fooin seiner natürlichen Form Schrägstriche enthalten sind? Sie möchten ihn Is nicht wollen nicht , dass die Unterscheidung der Empfehlung zu erhalten versucht? Es stellt ausdrücklich fest ,

Die Ähnlichkeit mit Dateinamenkonventionen für Unix und andere Datenträgerbetriebssysteme sollte als rein zufällig angesehen werden und nicht als Hinweis darauf, dass URIs als Dateinamen interpretiert werden sollten.

Wenn man eine Online-Schnittstelle zu einem Sicherungsprogramm erstellt und den Pfad als Teil des URL-Pfads ausdrücken möchte, ist es sinnvoll, die Schrägstriche im Dateipfad zu codieren, da dies nicht wirklich Teil der Hierarchie von ist Ressource - und vor allem die Route . /backups/2016-07-28content//home/dan/verliert die Wurzel des Dateisystems im doppelten Schrägstrich. Das Entkommen der Schrägstriche ist der geeignete Weg, um zu unterscheiden, wie ich es lese.

Daniel Farrell
quelle