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, foo
damit 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?
Antworten:
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_rewrite
es 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.
quelle
/
ein reserviertes Zeichen von seiner prozentual codierten Form unterscheidet%2F
.Die Geschichte von
%2F
vs/
war, dass nach den anfänglichen W3C-Empfehlungen Schrägstriche «eine hierarchische Struktur implizieren müssen» :quelle
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.
quelle
Wenn Sie Tomcat verwenden, fügen Sie in den VM-Eigenschaften '-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH = true' hinzu.
https://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html#Security
quelle
Was tun, wenn
:foo
in 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 ,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.quelle
encodeURI()
/decodeURI
undencodeURIComponent()
/decodeURIComponent
sind Dienstprogrammfunktionen, um dies zu handhaben. Lesen Sie hier mehr https://stackabuse.com/javascripts-encodeuri-function/quelle