Sequenze di escape
Quasi ogni bug di escape è un errore di contesto piuttosto che un errore di sintassi. Il carattere è noto — una virgoletta, una barra rovesciata, un'e commerciale — e ciò che è poco chiaro è quale delle sei regole conflittuali si applica dove la stringa sta per atterrare.
Quindi questa tabella è organizzata per contesto, non per carattere. La stessa virgoletta è raddoppiata in una cella CSV, con barra rovesciata sfuggita in JSON, trasformata in " in HTML e lasciata completamente da sola all'interno di virgolette singole in una shell. Quattro righe, quattro regole, un carattere.
La regola che importa di più è quella a cui la gente arriva per ultima: sfuggi al confine dove il valore sta per attraversare, e sfuggi una sola volta. Il testo che è sfuggito due volte — un & nel sorgente della pagina, un \\n nel file di output — è la firma di un valore che ha attraversato due codificatori che assumevano ciascuno di essere i primi.
Stringhe JSON
10JSON consente esattamente questi escape. Una newline o una scheda letterale all'interno di una stringa non è valida.
| Escape | Significa | Quando ne hai bisogno | Nel contesto |
|---|---|---|---|
| \" | " | Una virgoletta doppia all'interno di una stringa | "say \"hi\"" |
| \\ | \ | Una barra rovesciata letteraleLa ragione per cui i percorsi Windows rompono JSON. | "C:\\dir" |
| \/ | / | Una barra in avanti — facoltativoLegale ma non necessario; un'abitudine dal incorporamento JSON in tag <script>. | "a\/b" |
| \n | U+000A | Un'alimentazione della linea | "line\nline" |
| \r | U+000D | Un ritorno di carrello | |
| \t | U+0009 | Una scheda | |
| \b | U+0008 | Un backspace | |
| \f | U+000C | Un feed di modulo | |
| \u00e9 | é | Un carattere qualsiasi dal suo punto di codice a quattro cifre | "caf\u00e9" |
| \ud83d\ude00 | 😀 | Un carattere sopra U+FFFF, come una coppia surrogataJSON non ha il modulo \u{…}, quindi i caratteri astrali richiedono due escape. |
Stringhe JavaScript
10Un superset di JSON, più gli escape dei letterali di template.
| Escape | Significa | Quando ne hai bisogno | Nel contesto |
|---|---|---|---|
| \' | ' | Una virgoletta singola all'interno di una stringa tra virgolette singole | |
| \" | " | Una virgoletta doppia all'interno di una stringa tra virgolette doppie | |
| \` | ` | Un backtick all'interno di un letterale di template | |
| \${ | ${ | Un ${letterale all'interno di un letterale di templateSenza la barra rovesciata avvia un'interpolazione. | |
| \n | U+000A | Un'alimentazione della linea | |
| \xe9 | é | Un carattere di due cifre esadecimali, fino a U+00FF | |
| \u00e9 | é | Un carattere da quattro cifre esadecimali | |
| \u{1f600} | 😀 | Un qualsiasi punto di codice, per quanto lungoNon ha bisogno di una coppia surrogata, a differenza della forma a quattro cifre. | |
| \0 | U+0000 | Un carattere nullo | |
| \u2028 | U+2028 | Separatore di lineaValido in una stringa JS ma non in JSON — una rottura JSONP classica. |
Testo HTML e attributi
8Solo & e < devono rigorosamente essere sfuggiti nel testo; le virgolette contano all'interno degli attributi.
| Escape | Significa | Quando ne hai bisogno | Nel contesto |
|---|---|---|---|
| & | & | Un'e commercialeSfuggi a questo per primo, o ogni altro escape si raddoppia. | |
| < | < | Un segno minore, quindi non inizia un tag | |
| > | > | Un segno maggiore di | |
| " | " | Una virgoletta doppia all'interno di un attributo | |
| ' | ' | Una virgoletta singola all'interno di un attributo' funziona anche in HTML5, ma la forma numerica è sicura ovunque. | |
| | U+00A0 | Uno spazio non-breaking | |
| é | é | Un carattere qualsiasi dal suo punto di codice decimale | |
| é | é | Un carattere qualsiasi dal suo punto di codice esadecimale |
URL (codifica percentuale)
9Quali caratteri hanno bisogno di sfuggire dipende dalla parte dell'URL in cui si trovano.
| Escape | Significa | Quando ne hai bisogno | Nel contesto |
|---|---|---|---|
| %20 | Uno spazio, valido in qualsiasi punto di un URL | ||
| + | Uno spazio, ma solo in una stringa di query codificata con moduloIn un segmento di percorso questo è un segno più letterale. | ||
| %25 | % | Un segno di percentuale letteraleMancalo e il valore decodifica due volte. | |
| %2F | / | Una barra all'interno di un singolo segmento di percorso | |
| %3F | ? | Un punto interrogativo all'interno di un valore | |
| %26 | & | Un'e commerciale all'interno di un valore di parametro | |
| %3D | = | Un segno uguale all'interno di un valore di parametro | |
| %23 | # | Un hash, quindi non inizia il frammento | |
| %C3%A9 | é | Un carattere non-ASCII, come i suoi byte UTF-8Un carattere può diventare due, tre o quattro gruppi di percentuali. |
Campi CSV
5RFC 4180: avvolgi il campo tra virgolette, quindi raddoppia quello interno. Le barre rovesciate non significano nulla.
| Escape | Significa | Quando ne hai bisogno | Nel contesto |
|---|---|---|---|
| "" | " | Una virgoletta all'interno di un campo tra virgolette — raddoppiala | "say ""hi""" |
| "a,b" | , | Un campo contenente il delimitatore — avvolgi il campo | |
| "a b" | U+000A | Un campo contenente un'interruzione di riga — avvolgi il campo | |
| " a" | Conserva spazi iniziali o finaliSenza virgolette, molti parser li ritagliano. | ||
| '=SUM(A1) | = | Interrompi un foglio di calcolo eseguendo la cella come una formulaSi applica a valori che iniziano con =, +, - o @. Questo è injection formula. |
Letterali SQL e identificatori
6Leggili; non scriverli. Usa query parametrizzate invece.
| Escape | Significa | Quando ne hai bisogno | Nel contesto |
|---|---|---|---|
| '' | ' | Una virgoletta all'interno di un letterale di stringa — raddoppiala | 'O''Brien' |
| "order" | order | Una parola riservata usata come nome di colonnaLe virgolette doppie sono lo standard; SQL Server usa [parentesi graffe]. | |
| `order` | order | Lo stesso in MySQL e MariaDB | |
| \% | % | Un percentuale letterale all'interno di un modello LIKE | |
| \_ | _ | Un underscore letterale all'interno di un modello LIKE | |
| $tag$ … $tag$ | ' | Quotazione dollaro PostgreSQL — nessun escape al suo interno affattoUtile per i corpi del codice, dove raddoppiare ogni virgoletta è illeggibile. |
Argomenti shell
6Le virgolette singole sono letterali, le virgolette doppie ancora si espandono variabili.
| Escape | Significa | Quando ne hai bisogno | Nel contesto |
|---|---|---|---|
| '…' | $ ` \ | Tutto all'interno è letteraleLa quotazione più sicura che ci sia — ma non può contenere una virgoletta singola. | |
| "…" | * ? space | I globs e gli spazi sono sicuri, le variabili si espandono ancoraAlways quote variables: "$var", never bare $var. | |
| \ | Uno spazio in un nome file senza virgolette | ||
| \$ | $ | Un segno di dollaro letterale all'interno di virgolette doppie | |
| \` | ` | Un backtick letterale, non una sostituzione di comando | |
| '\'' | ' | Una virgoletta singola all'interno di virgolette singoleChiudi, sfuggi, riapri — non c'è modo di annidarla direttamente. |