Sekwencje escapowania
Prawie każdy błąd escapowania to błąd kontekstu, a nie błąd składni. Znak jest znany — cudzysłów, backslash, ampersand — i to, co jest niejasne, to która z sześciu sprzecznych zasad stosuje się tam, gdzie string ląduje.
Tak więc ta tabela jest zorganizowana po kontekście, a nie po znaku. Ten sam cudzysłów jest podwojony w komórce CSV, escapowany backslashem w JSON, zamieniony na " w HTML i całkowicie pozostawiony w spokoju wewnątrz pojedynczych cudzysłów w shell. Cztery wiersze, cztery zasady, jeden znak.
Zasada, która ma znaczenie większość, to ta, którą ludzie sięgają po ostatnią: escapuj na granicy, którą wartość przekracza, i escapuj ją raz. Tekst escapowany dwa razy — & w źródle strony, \\n w pliku wyjściowym — to sygnatura wartości, która przeszła przez dwóch koderów, którzy każdy zakładali, że są pierwsi.
Łańcuchy JSON
10JSON pozwala dokładnie na te escapowania. Dosłowny newline lub tab wewnątrz łańcucha jest nieprawidłowy.
| Escapowanie | Oznacza | Kiedy tego potrzebujesz | W kontekście |
|---|---|---|---|
| \" | " | Podwójny cudzysłów wewnątrz łańcucha | "say \"hi\"" |
| \\ | \ | Dosłowny backslashPowód, dla którego ścieżki Windows łamią JSON. | "C:\\dir" |
| \/ | / | Slash do przodu — opcjonalnieLegalne, ale niepotrzebne; nawyk z osadzania JSON w <script> tagach. | "a\/b" |
| \n | U+000A | Podawaj w sobie | "line\nline" |
| \r | U+000D | Powrót karetki | |
| \t | U+0009 | Tabulacja | |
| \b | U+0008 | Backspace | |
| \f | U+000C | Podawaj się | |
| \u00e9 | é | Dowolny znak wg jego czterocyfrowego punktu kodu | "caf\u00e9" |
| \ud83d\ude00 | 😀 | Znak powyżej U+FFFF, jako para zastępczaJSON nie ma formy \u{…}, więc znaki astralne wymagają dwóch escapowań. |
Łańcuchy JavaScript
10Nadzbiór JSON, plus ucieczki szablonu dosłownego.
| Escapowanie | Oznacza | Kiedy tego potrzebujesz | W kontekście |
|---|---|---|---|
| \' | ' | Pojedynczy cudzysłów wewnątrz jednokrotnie cytowanego łańcucha | |
| \" | " | Podwójny cudzysłów wewnątrz dwukrotnie cytowanego łańcucha | |
| \` | ` | Backtick wewnątrz szablonu dosłownego | |
| \${ | ${ | Dosłowny ${ wewnątrz szablonu dosłownegoBez backslasha to rozpoczyna interpolację. | |
| \n | U+000A | Podawaj w sobie | |
| \xe9 | é | Znak według dwóch cyfr hex, aż do U+00FF | |
| \u00e9 | é | Znak czterema cyframi szesnastkowymi | |
| \u{1f600} | 😀 | Dowolny punkt kodu, jednak długiNie potrzebuje pary zastępczej, w przeciwieństwie do czterocyfrowej formy. | |
| \0 | U+0000 | Znacz zero | |
| \u2028 | U+2028 | Separator wierszaPrawidłowy w łańcuchu JS, ale nie w JSON — klasyczne JSONP uszkodzenie. |
Tekst HTML i atrybuty
8Tylko & i < ściśle muszą być escapowane w tekście; cudzysłowy mają znaczenie wewnątrz atrybutów.
| Escapowanie | Oznacza | Kiedy tego potrzebujesz | W kontekście |
|---|---|---|---|
| & | & | AmpersandEscapuj ten pierwszy, inaczej co drugi escape się podwaja. | |
| < | < | Mniej niż logika, więc nie zaczyna tagu | |
| > | > | Większa niż logika | |
| " | " | Podwójny cudzysłów wewnątrz atrybutu | |
| ' | ' | Pojedynczy cudzysłów wewnątrz atrybutu' także działa w HTML5, ale forma liczbowa jest bezpieczna wszędzie. | |
| | U+00A0 | Spacja nierdzenna | |
| é | é | Dowolny znak przez dziesiętkowy punkt kodowy | |
| é | é | Dowolny znak przez szesnastkowy punkt kodowy |
Adresy URL (kodowanie procentowe)
9Które znaki wymagają escapowania, zależy od części adresu URL, w której siedzi.
| Escapowanie | Oznacza | Kiedy tego potrzebujesz | W kontekście |
|---|---|---|---|
| %20 | Spacja, prawidłowa w dowolnym miejscu w adresie URL | ||
| + | Spacja, ale tylko w łańcuchu zapytania zakodowanego w postaciW segmencie ścieżki to dosłowny znak plus. | ||
| %25 | % | Dosłowny znak procentPomiń to i wartość dekoduje się dwa razy. | |
| %2F | / | Slash wewnątrz segmentu pojedynczej ścieżki | |
| %3F | ? | Znak zapytania wewnątrz wartości | |
| %26 | & | Ampersand wewnątrz wartości parametru | |
| %3D | = | Znak równości wewnątrz wartości parametru | |
| %23 | # | Hash, więc nie zaczyna fragmentu | |
| %C3%A9 | é | Znak nie-ASCII, ponieważ jego bajty UTF-8Jeden znak może stać się dwema, trzema lub czterema grupami procentów. |
Pola CSV
5RFC 4180: opatruj pole w cudzysłowy, a następnie podwój każdy cudzysłów wewnątrz niego. Backslashe nie znaczą nic.
| Escapowanie | Oznacza | Kiedy tego potrzebujesz | W kontekście |
|---|---|---|---|
| "" | " | Cudzysłów wewnątrz cytowanego pola — podwój go | "say ""hi""" |
| "a,b" | , | Pole zawierające ogranicznik — opatruj pole | |
| "a b" | U+000A | Pole zawierające przerwę wiersza — opatruj pole | |
| " a" | Zachowaj spacje wiodące lub końcoweNiecytowany, wielu parserów je tnie. | ||
| '=SUM(A1) | = | Zatrzymaj komórkę arkusza kalkulacyjnego wykonującą się jako formułaDotyczy wartości zaczynających się =, +, - lub @. To jest iniekcja formuły. |
Literały SQL i identyfikatory
6Czytaj je; nie pisz ich. Zamiast tego użyj sparametryzowanych zapytań.
| Escapowanie | Oznacza | Kiedy tego potrzebujesz | W kontekście |
|---|---|---|---|
| '' | ' | Cudzysłów wewnątrz dosłownika łańcucha — podwój go | 'O''Brien' |
| "order" | order | Zastrzeżone słowo używane jako nazwa kolumnyPodwójne cudzysłowy to standard; SQL Server używa [nawiasów]. | |
| `order` | order | To samo w MySQL i MariaDB | |
| \% | % | Dosłowna % wewnątrz wzoru LIKE | |
| \_ | _ | Dosłowny _ wewnątrz wzoru LIKE | |
| $tag$ … $tag$ | ' | PostgreSQL cytuje dolar — bez escapowania wewnątrz w ogólePrzydatne dla ciał kodu, gdzie podwojenie każdego cudzysłowu jest nieczytelne. |
Argumenty Shell
6Pojedyncze cudzysłowy to dosłowne, podwójne cudzysłowy wciąż rozszerzają zmienne.
| Escapowanie | Oznacza | Kiedy tego potrzebujesz | W kontekście |
|---|---|---|---|
| '…' | $ ` \ | Wszystko wewnątrz jest dosłowneNajbezpieczniejsze cytowanie, które istnieje — ale nie może zawierać pojedynczych cudzysłowów. | |
| "…" | * ? space | Globy i spacje są bezpieczne, zmienne wciąż się rozszerzająAlways quote variables: "$var", never bare $var. | |
| \ | Spacja w niecytowanej nazwie pliku | ||
| \$ | $ | Dosłowny znak dolara wewnątrz podwójnych cudzysłowów | |
| \` | ` | Dosłowny backtick, nie podstawienie polecenia | |
| '\'' | ' | Pojedynczy cudzysłów wewnątrz jednokrotnie cytowanychZamknij, escapuj, otwórz ponownie — nie ma sposobu, aby go zagnieżdżać bezpośrednio. |