Escape sekvencie
Takmer každá chyba pri escapovaní je chybou kontextu, nie syntaxe. Znak je známy — úvodzovka, opačná lomka, ampersand — a nejasné je, ktoré zo šiestich protichodných pravidiel platí tam, kam sa ten text práve chystá.
Preto je táto tabuľka usporiadaná podľa kontextu, nie podľa znaku. Tá istá úvodzovka sa v CSV poli zdvojuje, v JSON-e escapuje opačnou lomkou, v HTML sa mení na " a vnútri jednoduchých úvodzoviek v shelle zostáva úplne nedotknutá. Štyri riadky, štyri pravidlá, jeden znak.
Najdôležitejšie pravidlo je to, po ktorom siahame ako po poslednom: escapujte na hranici, ktorú hodnota prekračuje, a escapujte raz. Text escapovaný dvakrát — & v zdroji stránky, \\n vo výstupnom súbore — je typický príznak hodnoty, ktorá prešla dvoma kodérmi a každý si myslel, že je prvý.
JSON reťazce
10JSON povoľuje presne tieto escapy. Doslovný nový riadok alebo tabulátor v reťazci je neplatný.
| Escape | Znamená | Kedy ho treba | V kontexte |
|---|---|---|---|
| \" | " | Dvojitá úvodzovka vnútri reťazca | "say \"hi\"" |
| \\ | \ | Doslovná opačná lomkaDôvod, prečo windowsové cesty rozbíjajú JSON. | "C:\\dir" |
| \/ | / | Dopredná lomka — voliteľnéLegálne, ale nepotrebné; zvyk z vkladania JSON-u do <script> tagov. | "a\/b" |
| \n | U+000A | Nový riadok (line feed) | "line\nline" |
| \r | U+000D | Návrat vozíka (carriage return) | |
| \t | U+0009 | Tabulátor | |
| \b | U+0008 | Backspace | |
| \f | U+000C | Zlom strany (form feed) | |
| \u00e9 | é | Ľubovoľný znak podľa štvorciferného kódového bodu | "caf\u00e9" |
| \ud83d\ude00 | 😀 | Znak nad U+FFFF ako surrogate párJSON nemá podobu \u{…}, takže znaky nad U+FFFF potrebujú dva escapy. |
JavaScript reťazce
10Nadmnožina tých z JSON-u, plus escapy pre template literály.
| Escape | Znamená | Kedy ho treba | V kontexte |
|---|---|---|---|
| \' | ' | Jednoduchá úvodzovka v reťazci s jednoduchými úvodzovkami | |
| \" | " | Dvojitá úvodzovka v reťazci s dvojitými úvodzovkami | |
| \` | ` | Spätný apostrof vnútri template literálu | |
| \${ | ${ | Doslovné ${ vnútri template literáluBez opačnej lomky začne interpoláciu. | |
| \n | U+000A | Nový riadok (line feed) | |
| \xe9 | é | Znak podľa dvoch hex číslic, po U+00FF | |
| \u00e9 | é | Znak podľa štyroch hex číslic | |
| \u{1f600} | 😀 | Ľubovoľný kódový bod bez ohľadu na dĺžkuNepotrebuje surrogate pár, na rozdiel od štvorciferného zápisu. | |
| \0 | U+0000 | Nulový znak | |
| \u2028 | U+2028 | Oddeľovač riadkovV JS reťazci platný, v JSON-e nie — klasická porucha JSONP. |
HTML text a atribúty
8V texte musia byť escapované striktne len & a <; úvodzovky sú dôležité v atribútoch.
| Escape | Znamená | Kedy ho treba | V kontexte |
|---|---|---|---|
| & | & | AmpersandEscapujte ho ako prvý, inak sa každý ďalší escape zdvojí. | |
| < | < | Znak menšie než, aby nezačal tag | |
| > | > | Znak väčšie než | |
| " | " | Dvojitá úvodzovka vnútri atribútu | |
| ' | ' | Jednoduchá úvodzovka vnútri atribútuV HTML5 funguje aj ', ale číselná podoba je bezpečná všade. | |
| | U+00A0 | Nezlomiteľná medzera | |
| é | é | Ľubovoľný znak podľa desiatkového kódového bodu | |
| é | é | Ľubovoľný znak podľa hexadecimálneho kódového bodu |
URL (percentové kódovanie)
9Ktoré znaky treba escapovať, závisí od časti URL, v ktorej stoja.
| Escape | Znamená | Kedy ho treba | V kontexte |
|---|---|---|---|
| %20 | Medzera, platná kdekoľvek v URL | ||
| + | Medzera, ale len vo form-encoded query stringuV ceste je to doslovné plus. | ||
| %25 | % | Doslovné percentoAk ho vynecháte, hodnota sa dekóduje dvakrát. | |
| %2F | / | Lomka vnútri jednej časti cesty | |
| %3F | ? | Otáznik vnútri hodnoty | |
| %26 | & | Ampersand vnútri hodnoty parametra | |
| %3D | = | Rovná sa vnútri hodnoty parametra | |
| %23 | # | Mriežka, aby nezačala fragment | |
| %C3%A9 | é | Znak mimo ASCII ako jeho UTF-8 bajtyZ jedného znaku môžu byť dve, tri aj štyri percentové skupiny. |
CSV polia
5RFC 4180: pole obaľte úvodzovkami a tú vnútri zdvojte. Opačné lomky nič neznamenajú.
| Escape | Znamená | Kedy ho treba | V kontexte |
|---|---|---|---|
| "" | " | Úvodzovka vnútri obaleného poľa — zdvojte ju | "say ""hi""" |
| "a,b" | , | Pole obsahujúce oddeľovač — obaľte pole | |
| "a b" | U+000A | Pole obsahujúce zlom riadku — obaľte pole | |
| " a" | Zachovanie medzier na začiatku alebo konciBez obalenia ich mnohé parsery odstrihnú. | ||
| '=SUM(A1) | = | Zabráni tabuľkovému procesoru vykonať bunku ako vzorecPlatí pre hodnoty začínajúce =, +, - alebo @. Toto je formula injection. |
SQL literály a identifikátory
6Toto čítajte, nepíšte. Použite parametrizované dopyty.
| Escape | Znamená | Kedy ho treba | V kontexte |
|---|---|---|---|
| '' | ' | Úvodzovka vnútri reťazcového literálu — zdvojte ju | 'O''Brien' |
| "order" | order | Rezervované slovo použité ako názov stĺpcaDvojité úvodzovky sú štandard; SQL Server používa [hranaté zátvorky]. | |
| `order` | order | To isté v MySQL a MariaDB | |
| \% | % | Doslovné % vnútri vzoru LIKE | |
| \_ | _ | Doslovný _ vnútri vzoru LIKE | |
| $tag$ … $tag$ | ' | Dolárové obaľovanie v PostgreSQL — vnútri sa neescapuje vôbec ničUžitočné pre telá kódu, kde je zdvojovanie každej úvodzovky nečitateľné. |
Argumenty v shelle
6Jednoduché úvodzovky sú doslovné, dvojité stále rozvíjajú premenné.
| Escape | Znamená | Kedy ho treba | V kontexte |
|---|---|---|---|
| '…' | $ ` \ | Všetko vnútri je doslovnéNajbezpečnejšie obaľovanie, aké existuje — ale nemôže obsahovať jednoduchú úvodzovku. | |
| "…" | * ? space | Globy a medzery sú v bezpečí, premenné sa stále rozvíjajúPremenné vždy obaľujte: "$var", nikdy bez úvodzoviek. | |
| \ | Medzera v neobalenom názve súboru | ||
| \$ | $ | Doslovný znak dolára vnútri dvojitých úvodzoviek | |
| \` | ` | Doslovný spätný apostrof, nie substitúcia príkazu | |
| '\'' | ' | Jednoduchá úvodzovka vnútri jednoduchých úvodzoviekZavrieť, escapovať, otvoriť — priamo sa vnoriť nedá. |