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
Weitere Artikel zum Lesen
5 Min. gelesen
Base64 dekodieren und kodieren: für den Transport, nicht für
Base64 im Browser dekodieren und kodieren – die 4/3-Größenregel, Auffüllung, die Base64URL-Variante und der Unicode-Fehler, der dekodierten Text wie Müll aussehen lässt.
5 Min. gelesen
cURL zum Abrufen: Verschieben einer Anfrage vom Terminal zum
cURL zum Abrufen der Konvertierung für JavaScript: korrekt zugeordnete Header, Textkörper, Authentifizierung und Methoden sowie die CORS-Realität, die entscheidet, ob eine Anfrage funktioniert.
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.