Hoppa till innehåll

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

10

JSON tillåter exakt dessa escapes. En bokstavlig radmatning eller tabb inuti en sträng är ogiltig.

EscapingBetyderNär du behöver detI 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"
\nU+000AEn radmatning"line\nline"
\rU+000DEn radreturbärare
\tU+0009En tabb
\bU+0008En backspace
\fU+000CEn 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

10

En överuppsättning av JSON, plus malliteral-escapens.

EscapingBetyderNär du behöver detI 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.
\nU+000AEn 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.
\0U+0000En nollkaraktär
\u2028U+2028RadavskiljareGiltig i en JS-sträng men inte i JSON — ett klassiskt JSONP-brott.

HTML-text och attribut

8

Bara & och < måste strängt escapes i text; citattecken spelar roll inuti attribut.

EscapingBetyderNär du behöver detI sammanhang
&amp;&Ett et-teckenEscapa den här först, eller varje annan escape fördubblas.
&lt;<Ett mindre-än-tecken, så det inte startar en tagg
&gt;>Ett större-än-tecken
&quot;"Ett dubbelt citattecken inuti ett attribut
&#39;'Ett enkelt citattecken inuti ett attribut&apos; fungerar också i HTML5, men den numeriska formen är säker överallt.
&nbsp;U+00A0Ett non-breaking space
&#233;éVilken karaktär som helst vid sitt decimalskodpunkt
&#xE9;éVilken karaktär som helst vid sitt hexskodpunkt

URL (procentkodning)

9

Vilka tecken som behöver escaping beror på delen av URL de sitter i.

EscapingBetyderNär du behöver detI 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

5

RFC 4180: citera fältet, fördubbla sedan det inre. Bakåtsnedstreck betyder ingenting.

EscapingBetyderNär du behöver detI 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+000AEtt 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

6

Läs dessa; skriv dem inte. Använd parameteriserade frågor istället.

EscapingBetyderNär du behöver detI sammanhang
'''Ett citattecken inuti en strängliteral — fördubbla det'O''Brien'
"order"orderEtt reserverat ord använt som ett kolumnnamnDubbla citattecken är standard; SQL Server använder [brackets].
`order`orderSamma 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

6

Enkla citattecken är bokstavliga, dubbla citattecken expanderar fortfarande variabler.

EscapingBetyderNär du behöver detI sammanhang
'…'$ ` \Allt inuti är bokstavligtDet säkraste citering där är — men det kan inte innehålla ett enkelt citattecken.
"…"* ? spaceGlobs 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.

FAQ

Varför går min JSON sönder på en Windows-filväg?
Eftersom ett bakåtsnedstreck startar en escape-sekvens i en JSON-sträng, läses C:\dir som C, sedan en ogiltig escape. Skriven korrekt är värdet "C:\\dir" — två bakåtsnedstreck i filen, ett i den analyserade strängen. Framåtsnedstreck fungerar på Windows också och undviker problemet helt.
Är %20 eller + korrekt för ett mellanslag i en URL?
Båda, på olika ställen. %20 är korrekt var som helst i en URL. Plustecknet betyder ett mellanslag endast inuti en frågesträng kodad som application/x-www-form-urlencoded — i ett vägsegment är det ett bokstavligt plustecken. Använd %20 när du är osäker, för det är rätt överallt.
Hur gör jag ett citattecken inuti ett CSV-fält?
Omslut fältet i citattecken och fördubbla det inre: "say ""hi""". Det är RFC 4180, och det är därför en CSV full av fördubblade citattecken inte är korrupt. Ett bakåtsnedstreck betyder ingenting för en konform CSV-parser.
Vad är det ledande apostrofen i CSV-formelraden till för?
Det neutraliserar en formelinjektion. En cell som börjar med =, +, - eller @ körs som en formel när filen öppnas i ett kalkylark, så ett värde som =SUM(A1) från en opålitlig källa blir kod. Att prefixa ett apostrof tvingar cellen att läsas som text.
Bör jag escapa SQL för hand?
Nej. Att fördubbla ett citattecken är dokumenterat här för att du behöver läsa escapad SQL, inte för att du bör skriva det — använd parameteriserade frågor och låt drivrutinen hantera värdet. Handescaping är där SQL-injektion kommer från, och det finns ingen version av det som är säker genom inspektion.