URL-Tools
URL-Kodierung für Leerzeichen: %20 oder Plus?
Ein Leerzeichen in einer URL wird innerhalb einer URI-Komponente zu %20 und nur bei formularbasierter Serialisierung zu +.
Von Vigneshwaran Vijayakumar, Entwickler und Herausgeber | | Geprüft gemäß der Redaktionsrichtlinie von ClockTools
Inhaltsverzeichnis
Ein Leerzeichen in URL-Daten wird normalerweise zu %20, aber die Abfrageserialisierung im Formularstil stellt es als dar +. Beides kann richtig sein. Die richtige Ausgabe hängt vom Ziel ab: Verwenden Sie die prozentuale Codierung für eine einzelne URI-Komponente und verwenden Sie die Plus-Konvention nur, wenn der empfangende Workflow dies erwartet application/x-www-form-urlencoded Daten.
Der URL-Encoder von ClockTools verdeutlicht diesen Kontext mit den Profilen URI-Komponente, Vollständige URL und Formulardaten. Fügen Sie green tea ein, wechseln Sie die Profile und vergleichen Sie die Ausgabe, bevor Sie Anwendungscode ändern.
Beginnen Sie mit dem Ziel
Fragen Sie nicht: „Welches Zeichen steht immer für ein Leerzeichen?“ Entscheidend ist: Welcher Parser erhält den Wert?
Für ein Pfadsegment, einen Fragmentwert oder einen einzelnen Abfragewert ist die prozentuale Codierung die zuverlässige Darstellung. Das UTF-8-Byte des Leerzeichens ist hexadezimal 20, also ist sein prozentcodiertes Triplett %20.
Bei HTML-Formulardaten verwendet die Serialisierungskonvention + für Leerzeichen und kodiert ein tatsächliches Pluszeichen als %2B. Der WHATWG-URL-Standard definiert dieses form-urlencoded-Verhalten getrennt vom allgemeinen URL-Parsing.
Die URI-Syntax nach RFC 3986 definiert ein prozentkodiertes Oktett als % gefolgt von zwei Hexadezimalziffern. Sie unterscheidet außerdem reservierte Trennzeichen von nicht reservierten Datenzeichen. Deshalb ist die Kodierung eines Wertes etwas anderes als die Kodierung einer vollständigen Adresse.
Entscheidungstabelle: %20 oder Pluszeichen
| Ziel | Darstellung des Leerzeichens | Beispiel für green tea | Warum |
|---|---|---|---|
| Pfadsegment | %20 | /topics/green%20tea | Leerzeichen sind Daten innerhalb eines Pfadsegments |
| Als Komponente kodierter Abfragewert | %20 | ?q=green%20tea | Durch die Komponentenkodierung wird der Wert von Trennzeichen getrennt |
| Form-urlencoded-Abfrage oder -Anfragetext | + | q=green+tea | Der Formularserialisierer ordnet Leerzeichen dem Pluszeichen zu |
| Vollständige URL-Anzeige | %20 wo ein tatsächliches Leerzeichen serialisiert werden muss | https://example.com/green%20tea?q=hot%20cup | Strukturell :, /, ?, =, und & bleiben Trennzeichen |
| Tatsächliches Pluszeichen in Formulardaten | %2B | q=C%2B%2B | Ein bloßes Plus würde als Leerzeichen in diesem Profil dekodiert |
Die letzte Zeile verhindert einen häufigen Fehler. Wenn der beabsichtigte Wert ist C++, senden C++ durch einen Form-Decoder erzeugen kann C . Codieren Sie jedes Literal plus als %2B vor dem Parsen des Formulars.
Vier reproduzierbare ClockTools-Tests
Wir haben vier kleine Eingaben durch die aktuelle Tool-Implementierung durchgeführt. Sein URI-Komponentenprofil verwendet JavaScript encodeURIComponent. Form Data wendet dieselbe Komponentenkodierung an und ersetzt sie dann %20 mit +. Vollständige URL verwendet encodeURI, wodurch die URL-Struktur erhalten bleibt.
| Eingabe | Profil | Beobachtete Ausgabe | Interpretation |
|---|---|---|---|
green tea | URI-Komponente | green%20tea | Eine Komponente mit prozentkodiertem Leerzeichen |
green tea | Formulardaten | green+tea | Leerzeichenkonvention für Formulardaten |
C++ | Formulardaten | C%2B%2B | Tatsächliche Pluszeichen bleiben geschützt |
https://example.com/a b?q=x y | Vollständige URL | https://example.com/a%20b?q=x%20y | URL-Trennzeichen bleiben strukturell |
Dies sind deterministische Umwandlungsergebnisse, keine Belege für Suchmaschinen-Rankings. Sie lassen sich lokal im Browser reproduzieren. Die Seite aktualisiert die Ausgabe sofort, zeigt Prozent-Escape-Sequenzen und Bytezahlen an und muss die Eingabe zur Umwandlung nicht an einen Server senden.
Nutzen Sie den URL-Decoder für die Gegenprobe. Dekodieren Sie green%20tea mit dem Komponentenprofil und green+tea mit Formulardaten. Der Decoder warnt bei einem Pluszeichen außerhalb des Formularprofils, weil die beabsichtigte Bedeutung unklar ist.
Was schützt die Komponentenkodierung?
Eine URL verwendet Satzzeichen als Grammatik. In einer Abfragezeichenfolge: & kann mit einem weiteren Parameter beginnen und = trennt einen Namen von einem Wert. # beginnt ein Fragment. ? beginnt eine Abfrage. Wenn eines dieser Zeichen zu den Benutzerdaten gehört, kann es zu einer Änderung der Struktur führen, wenn es roh bleibt.
Bedenken Sie den Wert timer & alarm. Komponentenkodierung erzeugt timer%20%26%20alarm. Das kaufmännische Und wird %26, sodass ein Parser einen Wert erhält, anstatt ihn zu interpretieren alarm als neuer Parameter.
Kodierung ist eine Darstellungsform, keine Validierung oder Verschlüsselung. Eine prozentkodierte Weiterleitung kann nach dem Dekodieren weiterhin auf einen nicht erlaubten Host zeigen. Ein kodiertes Skript bleibt eine nicht vertrauenswürdige Eingabe. Validieren Sie nach dem Parsing zulässige Schemata, Hosts, Parameternamen und Geschäftsregeln. Vermeiden Sie Passwörter, Tokens und andere Geheimnisse in URLs, da Adressen im Verlauf, in Protokollen, Analysedaten, Screenshots und Referrer-Daten erscheinen können.
Wenn Sie eine Abfragezeichenfolge vor und nach der Umwandlung vergleichen möchten, zeigt der Text-Diff-Checker jede geänderte Escape-Sequenz. Das ist zuverlässiger, als eine lange Callback-URL nach einem fehlenden %25 zu durchsuchen.
Warum erzeugt die Doppelkodierung %2520?
Eine doppelte Kodierung liegt vor, wenn bereits kodierter Text als Rohdaten behandelt und erneut kodiert wird.
Beginnen Sie mit einem Leerzeichen:
space -> %20Kodieren %20 als neue Komponente. Das Prozentzeichen wird %25, während die Ziffern wörtlich bleiben:
%20 -> %2520Eine Dekodierung ändert sich %2520 zurück zu %20. Eine zweite Dekodierung ändert sich %20 zu einem Raum. Wenn Ihre Anwendung einen Decodierungsdurchlauf erwartet, aber einen doppelt codierten Wert empfängt, wird dies dem Benutzer möglicherweise angezeigt %20 anstelle eines Leerzeichens.
Die Lösung besteht nicht darin, so oft zu dekodieren, bis der Text richtig aussieht. Wiederholtes Dekodieren kann bewusst kodierte Trennzeichen verändern und Sicherheitsprobleme verursachen. Klären Sie die Zuständigkeit: Genau eine Ebene sollte die Komponente kodieren und genau eine entsprechende Ebene sie dekodieren.
Fehlersuche bei unterschiedlich behandelten Leerzeichen
Verwenden Sie diesen Pfad, wenn ein System sendet %20 und ein weiteres Display +, %2520oder ein wörtliches Leerzeichen.
- Erfassen Sie den Rohwert, bevor ihn ein Framework-Parser ändert.
- Identifizieren Sie, ob es sich bei dem Feld um ein Pfadsegment, eine Abfragekomponente, eine vollständige URL oder einen Formulartext handelt.
- Notieren Sie den erwarteten dekodierten Wert, einschließlich literaler Pluszeichen.
- Reproduzieren Sie dieselbe Eingabe im passenden ClockTools-Profil.
- Dekodieren Sie einmal mit dem Profil der empfangenden Seite.
- Vergleichen Sie das Ergebnis mit dem erwarteten Wert.
- Durchsuchen Sie den Anwendungsfluss nach einem zweiten Encoder oder Decoder, wenn
%25erscheint unerwartet.
| Symptom | Erster Check | Wahrscheinliche Ursache |
|---|---|---|
green+tea bleibt bei einem Plus | Decoder-Profil | Der Komponentendecoder ordnet Plus nicht dem Leerzeichen zu |
C++ wird C | Absenderkodierung | Tatsächliche Pluszeichen wurden nicht kodiert als %2B |
%20 ist für Nutzende sichtbar | Anzahl der Dekodierungen | Kodierte Daten wurden nie dekodiert oder zuvor doppelt kodiert |
%2520 erscheint in einer Anfrage | Anzahl der Kodierungen | Prozentzeichen von %20 wurde erneut codiert |
| Die Abfrage wird nach einem kaufmännischen Und-Zeichen geteilt | Komponentengrenze | Ein kaufmännisches Und in den Daten blieb unkodiert |
Dieser Ablauf zur Fehlersuche ist bewusst eng gefasst. Er trennt den Datenkontext von Vermutungen; jeder Schritt hat eine sichtbare Eingabe und Ausgabe.
Wann sollten Sie eine vollständige URL kodieren?
Verwenden Sie das vollständige URL-Profil nur, wenn die Adresse eine Adresse bleiben soll. Strukturelle Interpunktion wie Doppelpunkt, Schrägstriche, Fragezeichen, Gleichheitszeichen, kaufmännisches Und und Fragmentmarkierung bleiben erhalten, während Zeichen wie Leerzeichen kodiert werden.
Verwenden Sie URI-Komponente, wenn eine vollständige URL selbst als Wert in einem anderen Parameter steckt. Eine Callback-Adresse in redirect= gilt aus Sicht der äußeren URL beispielsweise als Daten. Wird die verschachtelte Adresse als eine Komponente kodiert, können ihr ? und ihr & nicht Teil der äußeren Abfrage werden.
Führen Sie eine Adresse nicht wiederholt durch verschiedene Profile, in der Hoffnung auf eine allgemein sichere Zeichenfolge. Schreiben Sie die Grenze explizit:
outer URL structure + encodeURIComponent(inner callback URL)Die empfangende Anwendung sollte die äußere URL parsen, die Callback-Komponente extrahieren, einmal dekodieren, die entstandene innere URL parsen und das Ziel validieren. Kodierung bewahrt die Syntax; Validierung entscheidet, ob das Ziel erlaubt ist.
Häufig gestellte Fragen
Sollte ein URL-Leerzeichen %20 oder ein Pluszeichen sein?
Verwenden Sie %20 für ein Leerzeichen innerhalb einer allgemeinen URI-Komponente. Verwenden Sie +, wenn der empfangende Workflow explizit eine application/x-www-form-urlencoded-Serialisierung erwartet.
Warum wird ein Pluszeichen als Leerzeichen dekodiert?
Parser im Formularstil ordnen + im Rahmen der form-urlencoded-Konvention einem Leerzeichen zu. Ein allgemeiner Komponentendecoder muss diese Ersetzung nicht anwenden.
Wie kodiere ich ein wörtliches Pluszeichen in Formulardaten?
Kodieren Sie das Pluszeichen als %2B. Andernfalls kann ein Formulardecoder das unkodierte Pluszeichen als Leerzeichen interpretieren.
Was bedeutet %2520?
%2520 weist normalerweise auf eine doppelte Kodierung hin. Das Prozentzeichen in einem vorhandenen %20-Escape wurde zu %25, sodass eine Dekodierung %20 und eine zweite Dekodierung ein Leerzeichen zurückgibt.
Sollte ich eine vollständige URL mit encodeURIComponent kodieren?
Nicht, wenn das Schema, die Schrägstriche, die Abfragetrennzeichen und die Fragmentmarkierung strukturell bleiben sollten. Verwenden Sie die Komponentenkodierung, wenn die gesamte URL als Daten in einem anderen Wert verschachtelt ist.
Macht URL-Kodierung nicht vertrauenswürdige Eingaben sicher?
Nein. Bei der Codierung bleiben Syntaxgrenzen erhalten, aber der Empfänger muss nach dem Parsen weiterhin Schemata, Hosts, Weiterleitungen, Parameterwerte, Berechtigungen und andere Geschäftsregeln validieren.

