Escape-sekvenser
Nästan varje escaping-bugg är ett kontextfel snarare än ett syntaxfel. Tecknet är känt — ett citattecken, ett bakåtsnedstreck, ett et-tecken — och vad som är oklart är vilken av sex motstridiga regler som gäller där strängen är på väg att landa.
Så denna tabell är organiserad efter sammanhang, inte efter tecken. Samma citattecken fördubblas i en CSV-cell, är backslash-escapad i JSON, blir " i HTML och lämnas helt ensam inuti enkla citattecken i ett skal. Fyra rader, fyra regler, ett tecken.
Regeln som spelar störst roll är den som människor söker efter sist: escapa vid gränsen värdet korsar, och escapa den en gång. Text som är escapad två gånger — en & i sidkällan, en \\n i utfilen — är signaturen för ett värde som passerade genom två kodare som var och en antog att de var först.
JSON-strängar
10JSON tillåter exakt dessa escapes. En bokstavlig radmatning eller tabb inuti en sträng är ogiltig.
| Escaping | Betyder | När du behöver det | I sammanhang |
|---|---|---|---|
| \" | " | Ett dubbelt citattecken inuti en sträng | "say \"hi\"" |
| \\ | \ | Ett bokstavligt bakåtsnedstreckOrsaken Windows-vägar bryter JSON. | "C:\\dir" |
| \/ | / | Ett framåtsnedstreck — valfrittLagligt men onödigt; en vana från att bädda in JSON i <script>-taggar. | "a\/b" |
| \n | U+000A | En radmatning | "line\nline" |
| \r | U+000D | En radreturbärare | |
| \t | U+0009 | En tabb | |
| \b | U+0008 | En backspace | |
| \f | U+000C | En form feed | |
| \u00e9 | é | Vilken karaktär som helst vid dess fyrsiffrigt kodpunkt | "caf\u00e9" |
| \ud83d\ude00 | 😀 | En karaktär över U+FFFF, som ett surrogate-parJSON har ingen \u{…}-form, så astrala tecken tar två escapes. |
JavaScript-strängar
10En överuppsättning av JSON, plus malliteral-escapens.
| Escaping | Betyder | När du behöver det | I sammanhang |
|---|---|---|---|
| \' | ' | En enkelt citattecken inuti en enkelt-citerad sträng | |
| \" | " | Ett dubbelt citattecken inuti en dubbelt-citerad sträng | |
| \` | ` | Ett backtick inuti en malliteral | |
| \${ | ${ | En bokstavlig ${ inuti en malliteralUtan bakåtsnedstreck startar det en interpolation. | |
| \n | U+000A | En radmatning | |
| \xe9 | é | En karaktär med två hexsiffror, upp till U+00FF | |
| \u00e9 | é | En karaktär med fyra hexsiffror | |
| \u{1f600} | 😀 | Vilken kodpunkt som helst, hur lång som helstBehöver inget surrogate-par, till skillnad från fyrorsiffrigt-formen. | |
| \0 | U+0000 | En nollkaraktär | |
| \u2028 | U+2028 | RadavskiljareGiltig i en JS-sträng men inte i JSON — ett klassiskt JSONP-brott. |
HTML-text och attribut
8Bara & och < måste strängt escapes i text; citattecken spelar roll inuti attribut.
| Escaping | Betyder | När du behöver det | I sammanhang |
|---|---|---|---|
| & | & | Ett et-teckenEscapa den här först, eller varje annan escape fördubblas. | |
| < | < | Ett mindre-än-tecken, så det inte startar en tagg | |
| > | > | Ett större-än-tecken | |
| " | " | Ett dubbelt citattecken inuti ett attribut | |
| ' | ' | Ett enkelt citattecken inuti ett attribut' fungerar också i HTML5, men den numeriska formen är säker överallt. | |
| | U+00A0 | Ett non-breaking space | |
| é | é | Vilken karaktär som helst vid sitt decimalskodpunkt | |
| é | é | Vilken karaktär som helst vid sitt hexskodpunkt |
URL (procentkodning)
9Vilka tecken som behöver escaping beror på delen av URL de sitter i.
| Escaping | Betyder | När du behöver det | I sammanhang |
|---|---|---|---|
| %20 | Ett mellanslag, giltigt var som helst i en URL | ||
| + | Ett mellanslag, men bara i en formulärkodad frågesträngI ett vägsegment är det ett bokstavligt plustecken. | ||
| %25 | % | En bokstavlig procentsignMissa detta och värdet avkodas två gånger. | |
| %2F | / | Ett snedstreck inuti ett enkelt vägsegment | |
| %3F | ? | Ett frågetecken inuti ett värde | |
| %26 | & | Ett et-tecken inuti ett parametervärde | |
| %3D | = | Ett likhetstecken inuti ett parametervärde | |
| %23 | # | En hash, så den inte startar fragmentet | |
| %C3%A9 | é | En icke-ASCII-karaktär, som sina UTF-8-bytesEn karaktär kan bli två, tre eller fyra procentgrupper. |
CSV-fält
5RFC 4180: citera fältet, fördubbla sedan det inre. Bakåtsnedstreck betyder ingenting.
| Escaping | Betyder | När du behöver det | I sammanhang |
|---|---|---|---|
| "" | " | Ett citattecken inuti ett citeradt fält — fördubbla det | "say ""hi""" |
| "a,b" | , | Ett fält som innehåller avgränsaren — citera fältet | |
| "a b" | U+000A | Ett fält som innehåller ett radslut — citera fältet | |
| " a" | Bevara ledande eller efterföljande mellanslagOkiterad trimmar många parsers dem. | ||
| '=SUM(A1) | = | Stoppa ett kalkylark från att köra cellen som en formelGäller värden som börjar med =, +, - eller @. Detta är formelinjektion. |
SQL-literals och identifierare
6Läs dessa; skriv dem inte. Använd parameteriserade frågor istället.
| Escaping | Betyder | När du behöver det | I sammanhang |
|---|---|---|---|
| '' | ' | Ett citattecken inuti en strängliteral — fördubbla det | 'O''Brien' |
| "order" | order | Ett reserverat ord använt som ett kolumnnamnDubbla citattecken är standard; SQL Server använder [brackets]. | |
| `order` | order | Samma i MySQL och MariaDB | |
| \% | % | En bokstavlig % inuti ett LIKEmönster | |
| \_ | _ | En bokstavlig _ inuti ett LIKEmönster | |
| $tag$ … $tag$ | ' | PostgreSQL-dollarcittering — ingen escaping inuti allsAnvändbart för kroppar av kod, där att fördubbla varje citattecken är oläsligt. |
Skalargument
6Enkla citattecken är bokstavliga, dubbla citattecken expanderar fortfarande variabler.
| Escaping | Betyder | När du behöver det | I sammanhang |
|---|---|---|---|
| '…' | $ ` \ | Allt inuti är bokstavligtDet säkraste citering där är — men det kan inte innehålla ett enkelt citattecken. | |
| "…" | * ? space | Globs och mellanslag är säkra, variabler expanderar fortfarandeAlways quote variables: "$var", never bare $var. | |
| \ | Ett mellanslag i ett ociterad filnamn | ||
| \$ | $ | En bokstavlig dollartecken inuti dubbla citattecken | |
| \` | ` | Ett bokstavligt backtick, inte en kommandoersättning | |
| '\'' | ' | Ett enkelt citattecken inuti enkla citatteckenStäng, escapa, öppna — det finns ingen sätt att kapsla det direkt. |