Sekvence úniků
Téměř každá chyba únikového sekvence je chyba kontextu spíše než chyba syntaxe. Znak je znám — uvozovka, zpětné lomítko, ampersand — a nejasné je, která ze šesti konfliktních pravidel se uplatní tam, kde se má řetězec přistát.
Tato tabulka je uspořádána podle kontextu, ne podle znaku. Stejná uvozovka je zdvojnásobena v buňce CSV, uvozena zpětným lomítkem v JSON, převedena na " v HTML a zcela ponechána samotná uvnitř jednoduchých uvozovek v shellu. Čtyři řádky, čtyři pravidla, jeden znak.
Pravidlo, které má největší význam, je to, na které se lidé snaží naposledy: utíkejte na hranici, kterou hodnota překračuje, a utečte ji jednou. Text, který je uvádě́n dvakrát — & ve zdroji stránky, \\n v souboru výstup — je podpisem hodnoty, která prošla dvěma kodéry, které každý předpokládal, že je první.
Řetězce JSON
10JSON umožňuje přesně tyto úniky. Doslova nový řádek nebo karta uvnitř řetězce je neplatná.
| Escape | Znamená | Kdy jej potřebujete | V kontextu |
|---|---|---|---|
| \" | " | Dvoje uvozovky uvnitř řetězce | "say \"hi\"" |
| \\ | \ | Doslova zpětné lomítkoDůvod, proč se cesty Windows porouchají JSON. | "C:\\dir" |
| \/ | / | Lomítko — volitelnéPrávní, ale zbytečné; zvyk z vkládání JSON do <script> značky. | "a\/b" |
| \n | U+000A | Informační řádek | "line\nline" |
| \r | U+000D | Vrácení vozíku | |
| \t | U+0009 | Tabulátor | |
| \b | U+0008 | Backspace | |
| \f | U+000C | Formulář informační podavač | |
| \u00e9 | é | Libovolný znak jeho čtyřciferným bodem kódu | "caf\u00e9" |
| \ud83d\ude00 | 😀 | Znak nad U+FFFF, jako pár surrogátuJSON nemá \u{…} formu, takže astrální znaky trvají dva úniky. |
Řetězce JavaScript
10Nadmnožina JSON, plus úniky literálu šablony.
| Escape | Znamená | Kdy jej potřebujete | V kontextu |
|---|---|---|---|
| \' | ' | Jedná se o jednoduchou uvozovku v jednoduché-quoted řetězci | |
| \" | " | Dvoje uvozovky uvnitř řetězce v dvojitých uvozovkách | |
| \` | ` | Zpětné akutko uvnitř literálu šablony | |
| \${ | ${ | Doslova ${} uvnitř literálu šablonyBez zpětného lomítka to spouští interpolaci. | |
| \n | U+000A | Informační řádek | |
| \xe9 | é | Znak dva hex číslice, až do U+00FF | |
| \u00e9 | é | Znak čtyřcifrou hex | |
| \u{1f600} | 😀 | Libovolný bod kódu, ať je jakákoliv dlouháNepotřebuje pár surrogátu, na rozdíl od čtyřciferné formy. | |
| \0 | U+0000 | Nulový znak | |
| \u2028 | U+2028 | Oddělovač řádkůPlatné v řetězci JS, ale ne v JSON — klasické porušení JSONP. |
Text a atributy HTML
8Pouze & a < přísně musí být uvozeny v textu; uvozovky mají záležitost uvnitř atributů.
| Escape | Znamená | Kdy jej potřebujete | V kontextu |
|---|---|---|---|
| & | & | AmpersandUtěkněte tento nejprve, nebo se každý jiný únik zdvojnásobí. | |
| < | < | Znaménko menší než, takže nespouští značku | |
| > | > | Znamení větší než | |
| " | " | Dvoje uvozovky uvnitř atributu | |
| ' | ' | Jednu uvozovku v atributu' funguje také v HTML5, ale číselná forma je bezpečná všude. | |
| | U+00A0 | Bez přerušení mezery | |
| é | é | Libovolný znak desetinným bodem kódu | |
| é | é | Libovolný znak šestnáctkovým bodem kódu |
Adresy URL (procento-kódování)
9Které znaky potřebují únik, závisí na jejich části adresy URL.
| Escape | Znamená | Kdy jej potřebujete | V kontextu |
|---|---|---|---|
| %20 | Mezera, platná kdekoli v URL | ||
| + | Mezera, ale pouze v řetězci dotazu zakódovaném formulářem.V segmentu cesty je doslova plus znaménko. | ||
| %25 | % | Doslova znaménko procentaPokud to vynecháte a hodnota dvakrát dekóduje. | |
| %2F | / | Lomítko uvnitř jednoho segmentu cesty | |
| %3F | ? | Otazník uvnitř hodnoty | |
| %26 | & | Ampersand uvnitř hodnoty parametru | |
| %3D | = | Rovnítko uvnitř hodnoty parametru | |
| %23 | # | Hash, takže nespouští fragment | |
| %C3%A9 | é | Znak bez ASCII jako jeho bajtů UTF-8Jeden znak se může stát dvěma, třemi nebo čtyřmi skupinami procent. |
Pole CSV
5RFC 4180: citujte pole, poté zdvojnásobte jakoukoli uvozovku uvnitř. Zpětná lomítka znamená nic.
| Escape | Znamená | Kdy jej potřebujete | V kontextu |
|---|---|---|---|
| "" | " | Uvozovka uvnitř citovaného pole — zdvojnásobte ji | "say ""hi""" |
| "a,b" | , | Pole obsahující oddělovač — citujte pole | |
| "a b" | U+000A | Pole obsahující zalomení řádku — citujte pole | |
| " a" | Zachovejte přední nebo koncové mezeryBez uvozovek mnoho parserů oříznout. | ||
| '=SUM(A1) | = | Zastavit tabulkový procesor provádí buňku jako vzorecPlatí pro hodnoty počínaje =, +, - nebo @. Toto je injekce vzorce. |
Literály a identifikátory SQL
6Čtěte je; ne je psát. Místo toho používejte parametrizované dotazy.
| Escape | Znamená | Kdy jej potřebujete | V kontextu |
|---|---|---|---|
| '' | ' | Jednu uvozovku v řetězcovém literálu — zdvojnásobte ji | 'O''Brien' |
| "order" | order | Vyhrazené slovo používáno jako název sloupceDvoje uvozovky jsou standard; SQL Server používá [hranaté závorky]. | |
| `order` | order | Stejné v MySQL a MariaDB | |
| \% | % | Doslova % uvnitř vzoru LIKE | |
| \_ | _ | Doslova _ uvnitř vzoru LIKE | |
| $tag$ … $tag$ | ' | PostgreSQL dolar citování — bez úniku v celkuUžitečné pro těla kódu, kde zdvojnásobování každé uvozovky je nečitelné. |
Argumenty Shell
6Jednoduché uvozovky jsou doslova, dvojité uvozovky se stále rozšiřují proměnné.
| Escape | Znamená | Kdy jej potřebujete | V kontextu |
|---|---|---|---|
| '…' | $ ` \ | Všechno uvnitř je doslovaNejbezpečnější citování — ale nemůže obsahovat jednu uvozovku. | |
| "…" | * ? space | Globs a mezery jsou bezpečné, proměnné se stále rozšiřujíAlways quote variables: "$var", never bare $var. | |
| \ | Mezera v neuvozovaném názvu souboru | ||
| \$ | $ | Doslova znak dolaru uvnitř dvojitých uvozovek | |
| \` | ` | Doslova backtick, ne substituce příkazů | |
| '\'' | ' | Jednu uvozovku v jednoduchých uvozovkáchZavřít, utéct, znovu otevřít — neexistuje způsob, jak jej přímo vnořit. |