Strumenti URL
Codifica degli spazi negli URL: %20 o segno più?
Uno spazio URL diventa %20 in un componente URI e + solo nella serializzazione in stile modulo.
Di Vigneshwaran Vijayakumar, sviluppatore ed editore | | Revisionato secondo la politica editoriale di ClockTools
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 Codificatore URL di ClockTools rende esplicito il contesto con i profili Componente URI, URL completo e Dati modulo. Incolla green tea, cambiare profilo e confrontare l'output prima di modificare il codice dell'applicazione.
Inizia con la destinazione
Non chiederti «Quale simbolo indica sempre uno spazio?», ma 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 standard URL WHATWG definisce questo comportamento form-urlencoded separatamente dall'analisi generale degli URL.
Il documento sulla sintassi URI RFC 3986 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.
Tabella per scegliere tra %20 e segno più
| Destinazione | Rappresentazione dello spazio | Esempio per green tea | Perché |
|---|---|---|---|
| Segmento di percorso | %20 | /topics/green%20tea | Lo spazio fa parte dei dati di un singolo segmento di percorso |
| Valore della query codificato come componente | %20 | ?q=green%20tea | La codifica del componente mantiene il valore separato dai delimitatori |
| Query o corpo della richiesta in formato form-urlencoded | + | q=green+tea | Il serializzatore dei moduli converte lo spazio in un segno più |
| Visualizzazione completa dell'URL | %20 dove uno spazio letterale deve essere serializzato | https://example.com/green%20tea?q=hot%20cup | Strutturale :, /, ?, =, e & rimangono delimitatori |
| Segno più letterale nei dati di un modulo | %2B | q=C%2B%2B | In quel profilo, un segno più non codificato verrebbe decodificato come uno spazio |
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 encodeURIComponent. I dati del modulo applicano la stessa codifica del componente e quindi sostituiscono %20 con +. Utilizza l'URL completo encodeURI, che preserva la struttura dell'URL.
| Ingresso | Profilo | Risultato osservato | Interpretazione |
|---|---|---|---|
green tea | Componente URI | green%20tea | Un componente con lo spazio in codifica percentuale |
green tea | Dati del modulo | green+tea | Convenzione per gli spazi nel formato dei moduli |
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 |
Sono risultati di trasformazioni deterministiche, non prove del posizionamento nei motori di ricerca. Puoi riprodurli localmente nel browser. La pagina aggiorna subito il risultato, indica le sequenze di escape percentuali e il numero di byte e non ha bisogno di inviare l'input a un server per la conversione.
Usa il Decodificatore URL per eseguire il controllo inverso. Decodifica green%20tea sotto il profilo del componente e green+tea 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 & alarm. La codifica del componente produce timer%20%26%20alarm. La e commerciale diventa %26, quindi un parser riceve un valore invece di interpretarlo alarm 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 devi confrontare una stringa di query prima e dopo la codifica, il Confronto delle differenze tra testi 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:
space -> %20Codifica %20 come un nuovo componente. Il segno di percentuale diventa %25, mentre le cifre rimangono letterali:
%20 -> %2520Una 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 è ripetere la decodifica finché il testo sembra corretto. Decodifiche ripetute possono modificare delimitatori codificati intenzionalmente e creare problemi di sicurezza. Individua le responsabilità dei vari livelli: uno solo deve codificare il componente e un solo livello corrispondente deve decodificarlo.
Come individuare gli errori nella codifica degli spazi
Utilizzare questo percorso quando un sistema invia %20 e ne viene visualizzato un altro +, %2520o uno spazio letterale.
- Cattura il valore grezzo prima che qualsiasi parser del framework lo modifichi.
- Stabilisci se il campo è un segmento di percorso, un componente di query, un URL completo o il corpo di un modulo.
- Annota il valore decodificato atteso, compresi gli eventuali segni più letterali.
- Riproduci lo stesso input nel profilo ClockTools corrispondente.
- Decodifica una volta con il profilo ricevente.
- Confronta il risultato con il valore atteso.
- Cerca nel flusso dell'applicazione un secondo codificatore o decodificatore, se
%25appare inaspettatamente.
| Sintomo | Primo controllo | Probabile causa |
|---|---|---|
green+tea mantiene il segno più | Profilo del decodificatore | Il decodificatore di componenti non converte il segno più in uno spazio |
C++ diventa C | Codifica del mittente | I segni più letterali non sono stati codificati come %2B |
%20 è visibile all'utente | Numero di decodifiche | I dati codificati non sono mai stati decodificati o sono stati doppiamente codificati in precedenza |
%2520 appare in una richiesta | Numero di codifiche | Segno percentuale da %20 è stato nuovamente codificato |
| La query si divide dopo una e commerciale | Confine del componente | Una e commerciale contenuta nei dati è rimasta non codificata |
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 redirect= 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:
outer URL structure + encodeURIComponent(inner callback URL)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ù?
Usa %20 per uno spazio all'interno di un generico componente URI. Usa + quando il sistema ricevente richiede esplicitamente la serializzazione application/x-www-form-urlencoded.
Perché un segno più viene decodificato come uno spazio?
I parser dei moduli convertono + in uno spazio secondo la convenzione form-urlencoded. Un decodificatore generico di componenti non è tenuto ad applicare questa 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.

