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
10JSON staat precies deze escapes toe. Een letterlijke newline of tab in een tekenreeks is ongeldig.
| Escape | Middel | Wanneer je het nodig hebt | In 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" |
| \n | U+000A | Een regelinvoer | "line\nline" |
| \r | U+000D | Een terugkeer naar regelgeving | |
| \t | U+0009 | Een tabblad | |
| \b | U+0008 | Een backspace | |
| \f | U+000C | Een 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
10Een superset van JSON's, plus de template-letterlijke escapes.
| Escape | Middel | Wanneer je het nodig hebt | In 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. | |
| \n | U+000A | Een 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. | |
| \0 | U+0000 | Een nulteken | |
| \u2028 | U+2028 | RegelscheidingstekenGeldig in een JS-tekenreeks, maar niet in JSON — een klassieke JSONP-afbreking. |
HTML-tekst en attributen
8Alleen & en < moeten strikt in tekst worden ontsnapt; aanhalingstekens zijn belangrijk in attributen.
| Escape | Middel | Wanneer je het nodig hebt | In context |
|---|---|---|---|
| & | & | Een ampersandEscape die eerst, anders verdubbelt elk ander escape. | |
| < | < | Een kleiner-dan-teken, zodat het geen tag start | |
| > | > | Een groter-dan-teken | |
| " | " | Een dubbel aanhalingsteken in een attribuut | |
| ' | ' | Een enkel aanhalingsteken in een attribuut' werkt ook in HTML5, maar het numerieke formulier is overal veilig. | |
| | U+00A0 | Een onbrekbare spatie | |
| é | é | Elk teken op zijn decimale code point | |
| é | é | Elk teken op zijn hex code point |
URL's (procentcodering)
9Welke tekens moeten worden ontsnapt, hangt af van het deel van de URL waarin ze zitten.
| Escape | Middel | Wanneer je het nodig hebt | In 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
5RFC 4180: quote het veld, verdubbel vervolgens elk aanhalingsteken erin. Backslashes betekenen niets.
| Escape | Middel | Wanneer je het nodig hebt | In context |
|---|---|---|---|
| "" | " | Een aanhalingsteken in een gehaald veld — verdubbel het | "say ""hi""" |
| "a,b" | , | Een veld met het scheidingsteken — quote het veld | |
| "a b" | U+000A | Een 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
6Lees deze; schrijf ze niet. Gebruik in plaats daarvan geparametriseerde query's.
| Escape | Middel | Wanneer je het nodig hebt | In context |
|---|---|---|---|
| '' | ' | Een aanhalingsteken in een stringliteraal — verdubbel het | 'O''Brien' |
| "order" | order | Een gereserveerd woord gebruikt als kolomnaamDubbele aanhalingstekens zijn de standaard; SQL Server gebruikt [brackets]. | |
| `order` | order | Hetzelfde 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
6Enkele aanhalingstekens zijn letterlijk, dubbele aanhalingstekens breiden zich nog uit.
| Escape | Middel | Wanneer je het nodig hebt | In context |
|---|---|---|---|
| '…' | $ ` \ | Alles erin is letterlijkDe veiligste citaat ervan — maar het kan geen enkel aanhalingsteken bevatten. | |
| "…" | * ? space | Globs 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. |