Ga naar inhoud

Escapereeksen

Bijna elke escapingfout is een contextfout in plaats van een syntaxisfout. Het teken is bekend — een aanhalingsteken, een backslash, een ampersand — en wat onduidelijk is, is welke van zes conflicterende regels van toepassing is waar de tekenreeks op het punt staat aan te landen.

Deze tabel is dus georganiseerd op context, niet op teken. Hetzelfde aanhalingsteken wordt in een CSV-cel verdubbeld, met backslash-escaped in JSON, omgezet in " in HTML en volledig alleen gelaten binnen enkele aanhalingstekens in een shell. Vier rijen, vier regels, één teken.

De regel die het meest van belang is, is degene die mensen het laatst bereiken: escape op de grens die de waarde overschrijdt, en escape deze eenmaal. Tekst die twee keer is ontsnapt — een & in de paginabron, een \\n in het uitvoerbestand — is de handtekening van een waarde die door twee encoders is gegaan die elk aannamen dat ze eerst waren.

JSON-tekenreeksen

10

JSON staat precies deze escapes toe. Een letterlijke newline of tab in een tekenreeks is ongeldig.

EscapeMiddelWanneer je het nodig hebtIn context
\""Een dubbel aanhalingsteken in een tekenreeks"say \"hi\""
\\\Een letterlijke backslashDe reden waarom Windows-paden JSON breken."C:\\dir"
\//Een forward slash — optioneelLegaal maar onnodig; een gewoonte van het insluiten van JSON in <script>-tags."a\/b"
\nU+000AEen regelinvoer"line\nline"
\rU+000DEen terugkeer naar regelgeving
\tU+0009Een tabblad
\bU+0008Een backspace
\fU+000CEen formuliereinde
\u00e9éEen willekeurig teken op zijn viercijferige code point"caf\u00e9"
\ud83d\ude00😀Een teken boven U+FFFF, als een vervangingspaarJSON heeft geen \u{…} formulier, dus astrale tekens vergen twee escapes.

JavaScript-tekenreeksen

10

Een superset van JSON's, plus de template-letterlijke escapes.

EscapeMiddelWanneer je het nodig hebtIn context
\''Een enkel aanhalingsteken in een enkele-aangehaalde tekenreeks
\""Een dubbel aanhalingsteken in een dubbel-gehaalde tekenreeks
\``Een backtick in een template-letterlijk
\${${Een letterlijke ${ in een template-letterlijkZonder de backslash start het een interpolatie.
\nU+000AEen regelinvoer
\xe9éEen teken op twee hex cijfers, tot U+00FF
\u00e9éEen teken door vier hex cijfers
\u{1f600}😀Elke codepoint, hoe lang ookHeeft geen vervangingspaar nodig, in tegenstelling tot het viercijferige formulier.
\0U+0000Een nulteken
\u2028U+2028RegelscheidingstekenGeldig in een JS-tekenreeks, maar niet in JSON — een klassieke JSONP-afbreking.

HTML-tekst en attributen

8

Alleen & en < moeten strikt in tekst worden ontsnapt; aanhalingstekens zijn belangrijk in attributen.

EscapeMiddelWanneer je het nodig hebtIn context
&amp;&Een ampersandEscape die eerst, anders verdubbelt elk ander escape.
&lt;<Een kleiner-dan-teken, zodat het geen tag start
&gt;>Een groter-dan-teken
&quot;"Een dubbel aanhalingsteken in een attribuut
&#39;'Een enkel aanhalingsteken in een attribuut&apos; werkt ook in HTML5, maar het numerieke formulier is overal veilig.
&nbsp;U+00A0Een onbrekbare spatie
&#233;éElk teken op zijn decimale code point
&#xE9;éElk teken op zijn hex code point

URL's (procentcodering)

9

Welke tekens moeten worden ontsnapt, hangt af van het deel van de URL waarin ze zitten.

EscapeMiddelWanneer je het nodig hebtIn context
%20 Een spatie, geldig overal in een URL
+ Een spatie, maar alleen in een formule-gecodeerde queryreeksIn een padsegment is dit een letterlijk plusteken.
%25%Een letterlijk procenttekenMis dit en de waarde decodeert twee keer.
%2F/Een schuine streep in een enkel padsegment
%3F?Een vraagteken in een waarde
%26&Een ampersand in een parameterwaarde
%3D=Een gelijkteken in een parameterwaarde
%23#Een hash, zodat het niet het fragment start
%C3%A9éEen niet-ASCII-teken, als zijn UTF-8-bytesEén teken kan twee, drie of vier procentgroepen worden.

CSV-velden

5

RFC 4180: quote het veld, verdubbel vervolgens elk aanhalingsteken erin. Backslashes betekenen niets.

EscapeMiddelWanneer je het nodig hebtIn context
"""Een aanhalingsteken in een gehaald veld — verdubbel het"say ""hi"""
"a,b",Een veld met het scheidingsteken — quote het veld
"a b"U+000AEen veld met een regelafbreking — quote het veld
" a" Behoud voorloopspaties of spaties volgenOngecieerd, veel parsers trimmen ze.
'=SUM(A1)=Stop een spreadsheet door de cel als formule uit te voerenVan toepassing op waarden die beginnen met =, +, - of @. Dit is formuleinjectie.

SQL-letterwoorden en identifiers

6

Lees deze; schrijf ze niet. Gebruik in plaats daarvan geparametriseerde query's.

EscapeMiddelWanneer je het nodig hebtIn context
'''Een aanhalingsteken in een stringliteraal — verdubbel het'O''Brien'
"order"orderEen gereserveerd woord gebruikt als kolomnaamDubbele aanhalingstekens zijn de standaard; SQL Server gebruikt [brackets].
`order`orderHetzelfde in MySQL en MariaDB
\%%Een letterlijke % in een LIKE-patroon
\__Een letterlijke _ in een LIKE-patroon
$tag$ … $tag$'PostgreSQL-dollarcitaat — geen ontsnapping in het geheelNuttig voor lichaam van code, waarbij het verdubbelen van elk aanhalingsteken onleesbaar is.

Shell-argumenten

6

Enkele aanhalingstekens zijn letterlijk, dubbele aanhalingstekens breiden zich nog uit.

EscapeMiddelWanneer je het nodig hebtIn context
'…'$ ` \Alles erin is letterlijkDe veiligste citaat ervan — maar het kan geen enkel aanhalingsteken bevatten.
"…"* ? spaceGlobs en spaties zijn veilig, variabelen breiden nog uitAlways quote variables: "$var", never bare $var.
\ Een spatie in een niet-gehaalde bestandsnaam
\$$Een letterlijke dollarteken binnen dubbele aanhalingstekens
\``Een letterlijke backtick, geen bevel vervangen
'\'''Een enkel aanhalingsteken in enkel aangehaalde tekenreeksenSluiten, ontsnappen, heropenen — er is geen manier om het rechtstreeks in te nesten.

FAQ

Waarom breekt mijn JSON op een Windows-bestandspad?
Omdat een backslash een escapereeks in een JSON-tekenreeks start, dus C:\\dir wordt gelezen als C, vervolgens een ongeldige escape. Correct geschreven is de waarde "C:\\\\dir" — twee backslashes in het bestand, een in de geparste tekenreeks. Forward slashes werken ook op Windows en voorkomen het probleem volledig.
Is %20 of + correct voor een spatie in een URL?
Beiden, op verschillende plaatsen. %20 is overal in een URL correct. Het plusteken betekent alleen een spatie binnen een queryreeks die is gecodeerd als application/x-www-form-urlencoded — in een padsegment is het een letterlijk plusteken. Gebruik %20 wanneer u onzeker bent, omdat het overal juist is.
Hoe plaats ik een aanhalingsteken in een CSV-veld?
Omwikkel het veld met aanhalingstekens en verdubbel die binnenin: "say ""hi""". Dat is RFC 4180, en daarom is een CSV vol verdubbelde aanhalingstekens niet beschadigd. Een backslash betekent niets voor een conformer CSV-parser.
Wat is het voorafgaande apostrof in de CSV-formulefrij?
Het neutraliseert injectie van formuleformules. Een cel die begint met =, +, - of @ wordt als formule uitgevoerd wanneer het bestand in een spreadsheet wordt geopend, dus een waarde zoals =SUM(A1) uit een onbetrouwbare bron wordt code. Een apostrof voorvoegen dwingt de cel af te worden gelezen als tekst.
Moet ik SQL handmatig ontsnappen?
Nee. Verdubbeling van een aanhalingsteken is hier gedocumenteerd omdat je ontsnapte SQL moet lezen, niet omdat je het moet schrijven — gebruik geparametriseerde query's en laat het stuurprogramma de waarde afhandelen. Handmatig ontsnappen is waar SQL-injectie vandaan komt, en er is geen versie ervan die veilig is door inspectie.