YamlBox

Web & Kodierung · 5 Min. gelesen

URL-Kodierung: Wann man fliehen muss und wann man Dinge kaputt

URLs werden aus Zeichen zusammengesetzt, die für den Parser eine Bedeutung haben, und Zeichen, die lediglich Daten sind, und durch Prozentkodierung werden die beiden getrennt gehalten. Ein URL-Encoder wandelt Letzteres in `%XX`-Escapes um, sodass ein Wert, der `&`, `?` oder ein Leerzeichen enthält, die Fahrt überlebt. Bei den meisten URL-Bugs handelt es sich überhaupt nicht um Codierungsfehler – sie codieren den falschen Teil oder codieren zweimal.

Aktualisiert

Was muss kodiert werden

Ein kleiner Zeichensatz ist immer sicher – Buchstaben, Ziffern, `-`, `_`, `.` und `~`. Alles andere ist entweder reserviert oder sollte maskiert werden. Reservierte Zeichen sind die interessanten, weil sie in einem URL zulässig sind, aber nur an bestimmten Positionen: `?` startet eine Abfrage, `&` trennt Parameter, `=` weist einen Wert zu, `#` startet ein Fragment, `/` trennt Pfadsegmente. Fügen Sie eines davon in einen unverschlüsselten Wert ein und Sie haben die Struktur der URL stillschweigend umgeschrieben.

Plus oder %20

Der Weltraum ist das klassische Beispiel. In einem Pfad muss ein Leerzeichen `%20` sein; a `+` gibt es ein wörtliches Plus. In `application/x-www-form-urlencoded`-Körpern und Abfragezeichenfolgen, die von Formularparsern gelesen werden, wird `+` als Leerzeichen verstanden. Diese Divergenz ist der Grund, warum ein Wert in etwas kodiert werden kann, das in einem Kontext funktioniert und in einem anderen nicht funktioniert, und warum Decoder beide Interpretationen anbieten.

Kodieren Sie Komponenten, nicht ganze URLs. Das Ausführen eines vollständigen URL durch einen Komponenten-Encoder entgeht seinem eigenen `://` und `?` und erzeugt eine Verbindung, die sich in nichts auflöst.

Die JavaScript-Unterscheidung, die jeden begeistert

                encodeURI('https://x.com/a b?q=1')        // keeps :// ? = — for a whole URL
encodeURIComponent('a b?q=1')               // escapes ? and = — for one value
              

`encodeURI` behält die URL-Struktur bei und ist für eine vollständige Adresse gedacht; `encodeURIComponent` maskiert alles Signifikante und ist für einen einzelnen Parameterwert gedacht. Die Verwendung des falschen Werts führt entweder zu einem fehlerhaften URL oder zu einem Wert ohne Escapezeichen, und die Symptome sind entgegengesetzt: ein Link, der 404s erhält, oder eine Abfragezeichenfolge, die die Hälfte ihrer Parameter verliert.

Doppelte Kodierung und signierte URLs

Durch die Kodierung eines bereits kodierten Werts wird `%20` zu `%2520`, und der Server dekodiert ihn dann einmal und übergibt Ihrer Anwendung ein Literal `%20` an der Stelle, an der ein Leerzeichen vorgesehen war. Dies zeigt sich in mehrschichtigen Systemen – ein Proxy, der ein Ziel neu kodiert, ein Client, der einem URL entkommt, das er bereits erhalten hat. Bei signierten URLs ist dies am wichtigsten: Signaturen werden über die exakt codierte Zeichenfolge berechnet, sodass die Änderung des Escapezeichens eines Zeichens den Link ungültig macht, obwohl er immer noch zur gleichen Ressource aufgelöst wird.

Zum Debuggen dekodieren

Wenn eine Verbindung ausfällt, ist die Dekodierung der schnellste Weg, um zu sehen, wonach der Server tatsächlich gefragt wird – und die Antwort ist oft ein Wert, der in die Struktur gelangt ist. Wenn Sie im Browser arbeiten, können Sie ein URL mit Token, signierten Parametern oder Kundenkennungen einfügen, ohne es irgendwohin zu senden. Dies ist genau die Art von URL, die Sie nicht in einen Dienst einfügen sollten, der Anfragen protokolliert.

URL Encoder / Decoder – häufig gestellte Fragen

Sollte ein Leerzeichen %20 oder ein Pluszeichen sein?

Verwenden Sie `%20` in Pfaden und in jedem URL, das Sie selbst konstruieren; beide sind in Abfragezeichenfolgen gültig, wo Formularparser üblicherweise `+` als Leerzeichen lesen. Beim Dekodieren muss bekannt sein, welche Konvention die Zeichenfolge erzeugt hat.

Warum wird mein URL durch zweimaliges Codieren beschädigt?

Bei jedem Durchgang wird das Escape-Zeichen entkommen: Ein Leerzeichen wird zu `%20`, dann zu `%2520`. Bei der Ankunft dekodiert der Server einmal und Ihre Anwendung empfängt wörtlichen `%20`-Text. Einmal kodieren, an dem Punkt, an dem ein Rohwert Teil eines URL wird.

Was ist der Unterschied zwischen encodeURI und encodeURIComponent?

`encodeURI` lässt Strukturzeichen wie `://`, `?`, `&` und `=` intakt, sodass es zu einer ganzen Adresse passt. `encodeURIComponent` entgeht diesen ebenfalls, sodass es für einen einzelnen Parameterwert geeignet ist. Ihre Verwechslung ist die Ursache für die meisten fehlerhaften generierten Links.

In diesem Beitrag erwähnte Tools

Durchsuchen Sie die vollständige Liste der 19-Tools

Weitere Artikel zum Lesen

6 Min. gelesen

JWT-Decoder: Was ist in einem Token enthalten und was nicht

Verwenden Sie einen JWT-Decoder, um den Header, die Nutzlast und das Ablaufdatum eines Tokens zu überprüfen – und verstehen Sie, warum die Dekodierung nicht verifiziert, da die Anspruchsprüfungen hinter den meisten 401-Fehlern liegen.

Alle 19 Beiträge →