Codifica URL Spiegata: Cos'è la Codifica Percentuale
Ogni volta che clicchi un link, invii un modulo o digiti un indirizzo web, il tuo browser gestisce la codifica URL dietro le quinte. Quelle stringhe di segni percentuali e cifre esadecimali negli URL non sono casuali; sono un meccanismo attentamente progettato che fa funzionare Internet in modo affidabile. Comprendere la codifica URL è essenziale per sviluppatori web, progettisti di API e chiunque lavori con la tecnologia web.
Cos'è la Codifica URL?
La codifica URL, formalmente nota come codifica percentuale, è un meccanismo definito in RFC 3986 che converte i caratteri in un formato sicuro per la trasmissione negli URI. La specifica URL consente solo a un sottoinsieme di caratteri ASCII di apparire direttamente in un URL. Qualsiasi carattere non in questo insieme deve essere codificato come un segno percentuale (%) seguito da due cifre esadecimali.
< diventa %3C (60 = 3C in esadecimale).
Perché la Codifica URL è Necessaria
Gli URL usano certi caratteri come delimitatori: ? separa il percorso dalla query, & separa i parametri, = separa nome e valore, / separa i segmenti del percorso. Se questi caratteri appaiono nei dati, verrebbero interpretati erroneamente.
Considera una ricerca di "rock & roll": l'URL sarebbe /search?q=rock & roll. Il browser interpreterebbe & come separatore, dividendo la query. La codifica URL risolve: /search?q=rock%20%26%20roll.
Come Funziona la Codifica Percentuale
Il processo di codifica: caratteri non riservati (A-Z, a-z, 0-9, -, ., _, ~) non hanno bisogno di codifica. Caratteri riservati (:, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ;, =) devono essere codificati quando usati come dati. Tutto il resto deve essere codificato in percentuale.
- Usare la funzione di codifica sbagliata: encodeURI per i valori dei parametri lascia & e = non codificati.
- Doppia codifica: se il framework già codifica, codificare manualmente di nuovo porta a valori doppiamente codificati.
- Non decodificare lato server: la maggior parte dei framework decodifica automaticamente, ma se gestisci l'URL grezzo, devi decodificare.
Il Processo di Codifica per Caratteri Non-ASCII
I caratteri non-ASCII richiedono un passaggio aggiuntivo: prima il carattere viene convertito in sequenza di byte UTF-8, poi ogni byte viene codificato in percentuale. Il simbolo dell'euro (€) ha la sequenza UTF-8 E2 82 AC, diventando %E2%82%AC. Il carattere accentato "è" ha la sequenza UTF-8 C3 A8, diventando %C3%A8.
La codifica URL e la codifica entità HTML sono spesso confuse ma hanno scopi completamente diversi. La codifica URL converte i caratteri nel formato %XX per una trasmissione sicura negli URL (governata da RFC 3986). La codifica HTML converte i caratteri in riferimenti entità come &, < e > per un rendering sicuro nei documenti HTML.
Caratteri Codificati Comuni
In pratica, spesso hai bisogno di entrambe. Quando incorpori un URL in HTML, l'URL ha bisogno di codifica URL e se il valore dell'attributo contiene caratteri come & o ", l'intero valore potrebbe aver bisogno di codifica HTML.
| Carattere | Codifica | Codice ASCII | Motivo |
|---|---|---|---|
| Spazio | %20 | 32 (0x20) | Non consentito |
| ! | %21 | 33 (0x21) | Riservato |
| # | %23 | 35 (0x23) | Riservato (frammento) |
| $ | %24 | 36 (0x24) | Riservato |
| & | %26 | 38 (0x26) | Riservato (query) |
| ' | %27 | 39 (0x27) | Riservato |
| ( | %28 | 40 (0x28) | Riservato |
| ) | %29 | 41 (0x29) | Riservato |
| + | %2B | 43 (0x2B) | Riservato |
| , | %2C | 44 (0x2C) | Riservato |
| / | %2F | 47 (0x2F) | Riservato (percorso) |
| : | %3A | 58 (0x3A) | Riservato (protocollo) |
| ; | %3B | 59 (0x3B) | Riservato |
| = | %3D | 61 (0x3D) | Riservato (valore) |
| ? | %3F | 63 (0x3F) | Riservato (query) |
| @ | %40 | 64 (0x40) | Riservato (autorità) |
| [ | %5B | 91 (0x5B) | Riservato (IPv6) |
| ] | %5D | 93 (0x5D) | Riservato (IPv6) |
Codifica URL vs Codifica HTML
JavaScript fornisce tre funzioni: encodeURI (preserva i caratteri di struttura URL), encodeURIComponent (codifica tutto, incluso &, =, ?, /), e escape (obsoleto, non usare). Usa encodeURI per URL completi, encodeURIComponent per singoli valori di parametro.
Codifica URL
Python: urllib.parse.quote() per codifica, urllib.parse.quote_plus() che codifica gli spazi come +. PHP: urlencode() per stringhe di query (spazi come +), rawurlencode() per percorsi (spazi come %20).
Codifica HTML
Il carattere spazio ha due codifiche: %20 (standard RFC 3986, corretta per i componenti del percorso URL) e + (definita da application/x-www-form-urlencoded per i dati dei moduli nelle stringhe di query).
Differenze Chiave
| Aspetto | Codifica URL | Codifica HTML |
|---|---|---|
| URL e URI | %XX (percentuale + esadecimale) | <: %3C |
| Documenti HTML | &nome; o NNN; | < |
| Example for < | %3C | < |
| Example for & | %26 | & |
| Example for " | %22 | " |
| Purpose | Safe URL transmission | Prevent HTML injection |
| Specification | RFC 3986 | HTML Living Standard |
La doppia codifica si verifica quando i dati vengono codificati in URL più volte. Un attaccante potrebbe inviare %2527, che dopo la prima decodifica diventa %27, e dopo la seconda diventa una virgoletta singola '. Questo può bypassare la convalida dell'input, i filtri XSS e le protezioni SQL injection.
Codifica URL in Diversi Linguaggi
La codifica URL non è crittografia. È reversibile; chiunque può decodificare una stringa con codifica percentuale. Non usare mai la codifica URL come sostituto della crittografia o del controllo degli accessi. Dati sensibili non dovrebbero mai apparire negli URL.
JavaScript
Alcune applicazioni usano parametri di reindirizzamento con codifica URL. Convalida sempre i valori URL decodificati contro una whitelist di domini consentiti.
// encodeURI - encodes a complete URL
// Preserves: :, /, ?, #, &, =, +, @, ;, ,, !, ~, *, ', (, )
const url = encodeURI("https://example.com/search?q=hello world");
// Result: "https://example.com/search?q=hello%20world"
// encodeURIComponent - encodes a URL component
// Encodes ALL special characters including URL delimiters
const param = encodeURIComponent("price=100&discount=20");
// Result: "price%3D100%26discount%3D20"
// Never use escape() - it is deprecated
// It does not handle Unicode correctlyLa codifica URL può mascherare sequenze di attraversamento del percorso. I server web devono decodificare e normalizzare i percorsi prima di controllare gli attacchi di attraversamento.
Python
from urllib.parse import quote, quote_plus, urlencode
# quote - standard URL encoding (spaces as %20)
encoded = quote("hello world&more")
# Result: "hello%20world%26more"
# quote_plus - spaces become + instead of %20
encoded_plus = quote_plus("hello world")
# Result: "hello+world"
# urlencode - encodes a dictionary as a query string
params = {"q": "hello world", "lang": "en"}
query = urlencode(params)
# Result: "q=hello+world&lang=en"PHP
// urlencode - spaces become +
$encoded = urlencode("hello world&more");
// Result: "hello+world%26more"
// rawurlencode - RFC 3986 compliant (spaces as %20)
$raw = rawurlencode("hello world&more");
// Result: "hello%20world%26more"Il Carattere Spazio: %20 vs +
Quando costruisci URL con parametri di query dinamici, codifica sempre i valori. I segmenti di percorso con caratteri speciali hanno bisogno di codifica, ma non codificare i delimitatori di percorso.
- Confondere la codifica URL con Base64: Base64 codifica dati binari come ASCII. Non sono intercambiabili.
- Assumere che tutte le codifiche siano uguali: URL, HTML, JavaScript e CSS hanno tutti codifiche diverse.
Hai bisogno di codificare o decodificare rapidamente un URL? Prova il nostro strumento gratuito di codifica e decodifica URL online.
Implicazioni di Sicurezza
La codifica URL (codifica percentuale) converte i caratteri in un formato sicuro per la trasmissione negli URL. Sostituisce i caratteri non sicuri con un segno percentuale seguito da due cifre esadecimali.
Attacchi di Doppia Codifica
%20 è la rappresentazione con codifica URL del carattere spazio. Gli spazi non sono consentiti negli URL perché creerebbero ambiguità.
La codifica URL converte in formato %XX per la trasmissione negli URL. La codifica HTML converte in riferimenti entità per la visualizzazione nei documenti HTML. Hanno scopi diversi.
La Codifica URL Non è Crittografia
Usa encodeURI per URL completi (preserva :, /, ?, &, =). Usa encodeURIComponent per singoli valori di parametro (codifica tutti i caratteri speciali).
Vulnerabilità di Reindirizzamento Aperto
La codifica URL di per sé non è una misura di sicurezza. È un meccanismo di trasporto. Convalida e sanifica sempre l'input lato server.
Attraversamento del Percorso
../../etc/passwd%2e%2e%2f%2e%2e%2f%65%74%63%2f%70%61%73%73%77%64. Web
servers must decode and normalize paths before checking for traversal
attacks.
Esempi Pratici
Codifica dei Parametri di Query
When building URLs with dynamic query parameters, always encode the values:
const baseUrl = "https://api.example.com/search";
const query = "user input with special chars: & ? = #";
const url = `${baseUrl}?q=${encodeURIComponent(query)}`;
// Result: "https://api.example.com/search?q=user%20input%20with%20special%20chars%3A%20%26%20%3F%20%3D%20%23"Codifica dei Percorsi URL
Path segments that contain special characters need encoding, but you must not encode the path separators:
const category = "electronics & gadgets";
const product = "USB-C cable (6ft)";
const url = `/products/${encodeURIComponent(category)}/${encodeURIComponent(product)}`;
// Result: "/products/electronics%20%26%20gadgets/USB-C%20cable%20(6ft)"Decodifica dei Componenti URL
const encoded = "hello%20world%3F%26%3D%23";
const decoded = decodeURIComponent(encoded);
// Result: "hello world?&=#"Insidie Comuni
- Using the wrong encoding function:
encodeURI&=encodeURIComponentfor individual parameter values. - Encoding twice:
%2520%20. Know your framework's behavior. - Not decoding server-side: Most web frameworks automatically decode URL parameters, but if you are processing raw request URLs, you must decode them yourself. Failing to do so means your application receives encoded strings instead of the actual data.
- Confusing URL encoding with Base64:
aGVsbG8=, not percent-encoded strings. They are not interchangeable. - Assuming all encodings are the same:
\n\t), and CSS escaping are all different. Use the correct encoding for each context.
Need to encode or decode URLs quickly? Try our free online URL encoder and decoder tools.
Codifica URLDecodifica URLDomande Frequenti
Cos'è la Codifica URL?
URL encoding, also called percent-encoding, is a mechanism that converts characters into a format that can be safely transmitted in a URL. It replaces unsafe or reserved characters with a percent sign followed by two hexadecimal digits representing the character's byte value. For example, a space becomes %20 and a question mark becomes %3F.
Perché Alcuni URL Contengono %20?
%20 is the URL-encoded representation of a space character. Spaces are not allowed in URLs because they can be ambiguous and break URL parsing. The percent sign followed by 20 represents the hexadecimal value 0x20, which is the ASCII code for a space. Some systems also use + for spaces in query strings, but %20 is the standard encoding.
Differenza tra Codifica URL e Codifica HTML?
URL encoding converts characters to percent-encoded format (%XX) for safe transmission in URLs. HTML encoding converts characters to entity references (&, <, etc.) for safe display in HTML documents. They serve different purposes: URL encoding is for URLs, HTML encoding is for HTML content. A value like < needs both: %3C in a URL and < in HTML.
Quando Usare encodeURIComponent vs encodeURI?
Use encodeURI when encoding a complete URL, as it preserves URL structure characters like :, /, ?, &, and =. Use encodeURIComponent when encoding a single URL component value (like a query parameter), as it encodes ALL special characters including those that have structural meaning in URLs. Always use encodeURIComponent for query parameter values.
La Codifica URL Può Essere Usata per Scopi di Sicurezza?
URL encoding alone is not a security measure. It is a transport mechanism, not encryption or authentication. In fact, double encoding attacks can bypass security filters by encoding malicious input multiple times. Always validate and sanitize input on the server side, use parameterized queries for databases, and apply proper output encoding for the target context (HTML, URL, JavaScript).