L’escape dipende dal contesto
Una stringa non è mai «con escape» in astratto; ha l’escape per un posto specifico in cui sta per essere inserita, e ogni posto ha le proprie regole. Lo stesso testo richiede \" in JSON, '' in SQL, '\'' in una shell e " in HTML. Usare quello sbagliato è il modo in cui nascono i bug di iniezione: fare l’escape HTML prima di mettere il testo in una stringa JavaScript, o fare l’escape per la shell con i doppi apici lasciando attivo $.
| Contesto | Cosa richiede l’escape | Come |
|---|---|---|
| Stringa JSON | " \ e caratteri di controllo | \" \\ \n \t \u00XX |
| Shell, apici singoli | ' | '\'' (chiudi, apice letterale, riapri) |
| Shell, doppi apici | " \ $ ` e ! in bash interattiva | backslash |
| Letterale SQL | ' | '' (MySQL accetta anche \') |
| Regex | . * + ? ^ $ { } ( ) [ ] | \ / | backslash |
| C / Go / Rust / Java | " \ a capo tab | \" \\ \n \t \xHH \uHHHH |
| Campo CSV | , " a capo | racchiudi tra virgolette, raddoppia le virgolette |
| Testo HTML / XML | & < > " ' | & < > " ' / ' |
| YAML | Tutto ciò che è ambiguo: yes, no, 1.0, * o & iniziali, due punti | Doppi apici con escape JSON |
La shell, nello specifico
Gli apici singoli sono l’unico quoting completamente sicuro nelle shell POSIX: nulla al loro interno viene interpretato, e l’unico carattere che non può comparire è l’apice singolo stesso, che si scrive chiudendo la stringa, aggiungendo un apice con escape e ricominciando: 'it'\''s'. I doppi apici espandono ancora $variabili, `comandi` e \, quindi servono quando vuoi l’espansione. Quando passi dati da codice, non costruire affatto righe di comando: usa un array di argomenti (execve, subprocess.run([...]), exec.Command), e l’escape diventa superfluo.
SQL, nello specifico
Raddoppiare gli apici è SQL corretto, ma non è il modo in cui le applicazioni dovrebbero passare i valori. Le query parametrizzate ($1, ?, :name) inviano il valore separatamente dall’istruzione e rendono impossibile l’iniezione. Usa l’escape SQL per query estemporanee in una console, non nel codice.
Domande
Come metto un apice singolo dentro una stringa shell tra apici singoli?
Chiudi la stringa, aggiungi un apice con escape, ricomincia: 'it'\''s'. Oppure usa $'it\'s' in bash/zsh, che supporta gli escape con backslash.
Perché il mio JSON ha \u00e9 invece di é?
Alcuni codificatori fanno l’escape di tutto il non-ASCII per sicurezza nei canali a 7 bit. È comunque valido e decodifica nella stessa stringa. JSON.stringify in JavaScript e json.dumps con ensure_ascii=False in Python mantengono i caratteri.
Che differenza c’è tra escape e codifica?
L’escape protegge pochi caratteri speciali perché il testo possa stare dentro una sintassi; la codifica (Base64, URL) trasforma l’intera stringa in un alfabeto diverso. Base64 e la codifica URL sono incluse qui perché spesso servono nello stesso momento.
Posso fare l’escape per una regex in un linguaggio specifico?
L’escape per regex copre i metacaratteri condivisi da tutti i motori comuni (PCRE, JavaScript, Python, Go RE2, Java). Dentro una classe di caratteri [] contano solo ] \ ^ e -; lo strumento fa l’escape in modo conservativo perché il risultato funzioni ovunque.