Strumenti URL
Codifica URL per gli spazi: %20 o Plus?
Uno spazio URL diventa %20 in un componente URI e + solo nella serializzazione in stile modulo.
Di Vigneshwaran Vijayakumar, sviluppatore ed editore | | Recensito sotto il ClockTools politica editoriale
Sommario
Uno spazio nei dati URL di solito diventa %20, ma la serializzazione delle query in stile modulo lo rappresenta come +. Entrambi possono essere corretti. L'output corretto dipende dalla destinazione: utilizza la codifica percentuale per un singolo componente URI e utilizza la convenzione plus solo quando il flusso di lavoro di ricezione prevede application/x-www-form-urlencoded dati.
Il ClockTools Codificatore URL rende esplicito il contesto con i profili Componente URI, URL completo e Dati modulo. Incolla tè verde, cambiare profilo e confrontare l'output prima di modificare il codice dell'applicazione.
Inizia con la destinazione
Non chiedere “Quale simbolo significa sempre spazio?” Chiedi quale parser riceverà il valore.
Per un segmento di percorso, un valore di frammento o un singolo valore di query, la codifica percentuale è la rappresentazione affidabile. Il byte UTF-8 del carattere spazio è esadecimale 20, quindi la sua tripletta con codifica percentuale è %20.
Per i dati in stile modulo HTML viene utilizzata la convenzione di serializzazione + per spazi e percentuale codifica un plus letterale come %2B. Il URL WHATWG standard definisce questo comportamento con codifica dell'URL del modulo separatamente dall'analisi generale dell'URL.
Il RFC 3986 Sintassi dell'URI definisce un ottetto con codifica percentuale come % seguito da due cifre esadecimali. Distingue inoltre i delimitatori riservati dai caratteri di dati non riservati. Questa distinzione è il motivo per cui la codifica di un valore è diversa dalla codifica di un intero indirizzo.
La tabella decisionale %20 rispetto a più
| Destinazione | Rappresentazione dello spazio | Esempio per tè verde | Perché |
|---|---|---|---|
| Segmento di percorso | %20 | /argomenti/green%20tea | Lo spazio è costituito dai dati all'interno di un segmento del percorso |
| Valore della query codificato come componente | %20 | ?q=tè%20verde | La codifica del componente mantiene il valore separato dai delimitatori |
| Form-urlencoded query or request body | + | q=verde+tè | Il serializzatore del modulo mappa lo spazio su plus |
| Visualizzazione completa dell'URL | %20 dove uno spazio letterale deve essere serializzato | https://example.com/green%20tea?q=hot%20cup | Strutturale :, /, ?, =, e & rimangono delimitatori |
| Letterale più dati interni al modulo | %2B | q=C%2B%2B | Un semplice più verrebbe decodificato come uno spazio in quel profilo |
L'ultima riga previene un bug comune. Se il valore previsto è C++, invio C++ attraverso un decodificatore di moduli può produrre C . Codifica ogni lettera più come %2B prima dell'analisi del modulo.
Quattro test ClockTools riproducibili
Abbiamo eseguito quattro piccoli input attraverso l'attuale implementazione dello strumento. Il profilo del componente URI utilizza JavaScript codificaURIComponent. I dati del modulo applicano la stessa codifica del componente e quindi sostituiscono %20 con +. Utilizza l'URL completo codificaURI, che preserva la struttura dell'URL.
| Ingresso | Profilo | Produzione osservata | Interpretazione |
|---|---|---|---|
tè verde | Componente URI | tè verde%20 | Un componente, spazio codificato in percentuale |
tè verde | Dati del modulo | verde+tè | Form-style space convention |
C++ | Dati del modulo | C%2B%2B | I segni più letterali sono protetti |
https://example.com/a b?q=x y | URL completo | https://example.com/a%20b?q=x%20y | I delimitatori URL rimangono strutturali |
Questi sono risultati di trasformazione deterministica, non prove di classificazione della ricerca. Puoi riprodurli localmente nel browser. La pagina aggiorna immediatamente l'output, riporta la percentuale di escape e il conteggio dei byte e non è necessario inviare l'input a un server per la conversione.
Usa il Decodificatore URL per eseguire il controllo inverso. Decodifica tè verde%20 sotto il profilo del componente e verde+tè in Dati modulo. Il decodificatore avvisa quando appare un segno più sotto un profilo non-form perché il significato previsto è ambiguo.
Cosa protegge la codifica dei componenti?
Un URL utilizza la punteggiatura come grammatica. In una stringa di query, & può iniziare un altro parametro e = separa un nome da un valore. # inizia un frammento. ? inizia una query. Se uno di questi caratteri appartiene ai dati dell'utente, lasciarlo grezzo può modificare la struttura.
Considera il valore timer e sveglia. La codifica del componente produce timer%20%26%20allarme. La e commerciale diventa %26, quindi un parser riceve un valore invece di interpretarlo allarme come nuovo parametro.
La codifica è rappresentazione, non convalida o crittografia. Un reindirizzamento con codifica percentuale può ancora puntare a un host non approvato dopo la decodifica. Uno script codificato è ancora un input non attendibile. Convalida schemi, host, nomi di parametri e regole aziendali consentiti dopo l'analisi. Evita di inserire password, token o altri segreti negli URL perché gli indirizzi possono apparire nella cronologia, nei log, nelle analisi, negli screenshot e nei dati dei referrer.
Quando è necessario confrontare una stringa di query prima e dopo, il file Controllo differenze testo rende visibile ogni escape modificato. Questo è più affidabile della scansione di un URL di richiamata lungo per trovarne uno mancante %25.
Perché la doppia codifica crea %2520?
La doppia codifica avviene quando il testo già codificato viene trattato come dati grezzi e codificato nuovamente.
Inizia con uno spazio:
"testo".
spazio -> %20
```
Codificare %20 come un nuovo componente. Il segno di percentuale diventa %25, mentre le cifre rimangono letterali:
"testo".
%20 -> %2520
```
Una decodifica cambia %2520 tornare a %20. Una seconda decodifica cambia %20 ad uno spazio. Se la tua applicazione prevede un passaggio di decodifica ma riceve un valore con doppia codifica, l'utente potrebbe vedere %20 invece di uno spazio vuoto.
La soluzione è non decodificare ripetutamente finché il testo non appare corretto. La decodifica ripetuta può modificare i delimitatori codificati deliberatamente e creare problemi di sicurezza. Identificare il confine della proprietà: esattamente un livello dovrebbe codificare il componente ed esattamente un livello corrispondente dovrebbe decodificarlo.
Un percorso di debug per mancata corrispondenza dello spazio
Utilizzare questo percorso quando un sistema invia %20 e ne viene visualizzato un altro +, %2520o uno spazio letterale.
1. Cattura il valore grezzo prima che qualsiasi parser del framework lo modifichi.
2. Identificare se il campo è un segmento di percorso, un componente di query, un URL completo o il corpo del modulo.
3. Registrare il valore decodificato previsto, inclusi i segni più letterali.
4. Riproduci lo stesso input nel profilo ClockTools corrispondente.
5. Decodifica una volta con il profilo ricevente.
6. Confronta il risultato con il valore atteso.
7. Cerca nel flusso dell'applicazione un secondo codificatore o decodificatore, se %25 appare inaspettatamente.
| Sintomo | Primo controllo | Probabile causa |
|---|---|---|
verde+tè rimane con un vantaggio | Profilo del decodificatore | Il decodificatore del componente non mappa il segno positivo sullo spazio |
C++ diventa C | Codifica del mittente | I segni più letterali non sono stati codificati come %2B |
%20 è visibile all'utente | Conteggio decodifica | I dati codificati non sono mai stati decodificati o sono stati doppiamente codificati in precedenza |
%2520 appare in una richiesta | Conteggio codifica | Segno percentuale da %20 è stato nuovamente codificato |
| La query si divide dopo una e commerciale | Confine del componente | Una e commerciale di dati è stata lasciata grezza |
Questo percorso di debug è intenzionalmente ristretto. Separa il contesto dei dati dalle congetture e ogni passaggio ha un input e un output visibili.
Quando dovresti codificare un URL completo?
Utilizza il profilo URL completo solo quando desideri che l'indirizzo rimanga un indirizzo. Conserva la punteggiatura strutturale come i due punti dello schema, le barre, il punto interrogativo, il segno di uguale, la e commerciale e il marcatore di frammento durante la codifica di caratteri come gli spazi.
Utilizza il componente URI quando un URL completo è esso stesso annidato all'interno di un altro parametro. Ad esempio, un indirizzo di richiamata inserito in reindirizzamento= sono i dati dal punto di vista dell'URL esterno. La codifica dell'indirizzo nidificato come un componente lo impedisce ? e & dall'unirsi alla query esterna.
Non passare ripetutamente un indirizzo attraverso profili diversi sperando in una stringa universalmente sicura. Scrivi il confine in modo esplicito:
"testo".
struttura dell'URL esterno + encodeURIComponent(URL di callback interno)
```
L'applicazione ricevente dovrebbe analizzare l'URL esterno, estrarre il componente di callback, decodificarlo una volta, analizzare l'URL interno risultante e convalidare la destinazione. La codifica mantiene intatta la sintassi; la convalida decide se la destinazione è consentita.
Domande frequenti
Uno spazio URL dovrebbe essere %20 o un segno più?
Utilizza %20 per uno spazio all'interno di un componente URI generale. Utilizzare + quando il flusso di lavoro di ricezione prevede esplicitamente la serializzazione application/x-www-form-urlencoded.
Perché un segno più viene decodificato come uno spazio?
I parser in stile modulo mappano + su uno spazio come parte della convenzione form-urlencoded. Un decodificatore di componenti generali non deve applicare tale sostituzione.
Come posso codificare un segno più letterale nei dati del modulo?
Codifica il più come %2B. Altrimenti un decodificatore di moduli potrebbe interpretare il semplice segno più come uno spazio.
Cosa significa %2520?
%2520 solitamente indica la doppia codifica. Il segno di percentuale in un escape %20 esistente è diventato %25, quindi una decodifica restituisce %20 e una seconda decodifica restituisce uno spazio.
Devo codificare un intero URL con encodeURIComponent?
Non quando il suo schema, le barre, i delimitatori di query e il marcatore di frammento dovrebbero rimanere strutturali. Utilizza la codifica del componente quando l'intero URL è nidificato come dati all'interno di un altro valore.
La codifica URL rende sicuro l'input non attendibile?
No. La codifica preserva i limiti della sintassi, ma il destinatario deve comunque convalidare schemi, host, reindirizzamenti, valori dei parametri, autorizzazioni e altre regole aziendali dopo l'analisi.

