Перейти до вмісту

Послідовності екранування

Майже кожна помилка екранування — це помилка контексту, а не помилка синтаксису. Символ відомий — лапки, зворотний слеш, амперсанд — і невясно, яке із шести конфліктуючих правил застосовується там, де рядок збирається потрапити.

Отже, ця таблиця організована за контекстом, а не за символом. Ті самі лапки подвоюються в клітинці CSV, екрануються зворотним слешем у JSON, перетворюються на " у HTML і залишаються абсолютно безхідними всередину одиничних лапок у оболонці. Чотири рядки, чотири правила, один символ.

Правило, що має найбільше значення, — це те, яке люди дістають останніми: екранувати на межі, що значення перетинає, і екранувати його один раз. Текст, який екранується двічі — & у вихідному коді сторінки, \\n у файлі виходу — це сигнатура значення, що пройшло через два кодери, які обидва вважали себе першими.

Рядки JSON

10

JSON дозволяє саме ці екранування. Буквальна перерва або табуляція всередину рядка недійсна.

ЕкранОзначаєКоли вам це потрібноУ контексті
\""Подвійна лапка всередину рядка"say \"hi\""
\\\Літеральний зворотний слешПричина того, що шляхи Windows ламають JSON."C:\\dir"
\//Прямий слеш — необов'язковийЗаконний, але непотрібний; звичай від вбудовування JSON у <script> теги."a\/b"
\nU+000AПодача рядка"line\nline"
\rU+000DПовернення каретки
\tU+0009Табуляція
\bU+0008Зворотне простір
\fU+000CФорма подачі
\u00e9éБудь-який символ за його чотирьохзначною кодовою точкою"caf\u00e9"
\ud83d\ude00😀Символ вище U+FFFF як пара замінникаJSON не має \u{…} форми, тож астральні символи займають два екранування.

Рядки JavaScript

10

Надмножина JSON, плюс екранування літерального шаблону.

ЕкранОзначаєКоли вам це потрібноУ контексті
\''Одиничний лапки всередину односторонньої лапки рядка
\""Подвійна лапка всередину двостороннього лапки рядка
\``Зворотний лапки всередину літерального шаблону
\${${Літеральне ${ всередину літерального шаблонуБез зворотного слеша це починає інтерполяцію.
\nU+000AПодача рядка
\xe9éСимвол на двох шістнадцяткових цифр, до U+00FF
\u00e9éСимвол на чотирьох шістнадцяткових цифр
\u{1f600}😀Будь-яка кодова точка, однак довгийНе потребує пари замінника, на відміну від чотирьохзначної форми.
\0U+0000Нульовий символ
\u2028U+2028Роздільник рядківДійсний у рядку JS, але не в JSON — класична розбиття JSONP.

Текст HTML й атрибути

8

Лише & й < строго повинні екрануватись у текстові; лапки мають значення всередину атрибутів.

ЕкранОзначаєКоли вам це потрібноУ контексті
&amp;&АмперсандЕкранувати цей спочатку, або кожен інший екран подвойюється.
&lt;<Знак менше-ніж, так воно не починає тег
&gt;>Знак більше-ніж
&quot;"Подвійна лапка всередину атрибута
&#39;'Одиничний лапки всередину атрибута&apos; також працює в HTML5, але числова форма безпечна скрізь.
&nbsp;U+00A0Неперевирна пробіл
&#233;éБудь-який символ по десятковій кодовій точці
&#xE9;éБудь-який символ по шістнадцятковій кодовій точці

URL (екранування відсотком)

9

Які символи потрібно екранувати залежить від частини URL, де вони сидять.

ЕкранОзначаєКоли вам це потрібноУ контексті
%20 Пробіл, дійсний скрізь у URL
+ Пробіл, але лише в рядку запиту, кодованому формою.У сегменті шляху це буквальний знак плюса.
%25%Літеральний знак відсоткаПропустити це й значення декодується двічі.
%2F/Слеш всередину сегмента одного шляху
%3F?Знак питання всередину значення
%26&Амперсанд всередину значення параметра
%3D=Знак рівності всередину значення параметра
%23#Гаш, так воно не починає фрагмент
%C3%A9éСимвол не-ASCII як його UTF-8 байтиОдин символ може стати двома, трьома або чотирма групами відсотків.

Поля CSV

5

RFC 4180: обгорніть поле в лапки, потім подвойте будь-які лапки всередину нього. Зворотні слеші нічого не означають.

ЕкранОзначаєКоли вам це потрібноУ контексті
"""Лапки всередину цитованого поля — подвойте її"say ""hi"""
"a,b",Поле, що містить розмежувач — обгорніть поле
"a b"U+000AПоле, що містить розрив рядка — обгорніть поле
" a" Зберегти провідне або кінцеве місцеНевідзначено, багато парсерів обрізали їх.
'=SUM(A1)=Зупинити виконання клітинки як формулиЗастосовується до значень, що починаються з =, +, - або @. Це впровадження формули.

Літерали й ідентифікатори SQL

6

Прочитайте їх; не пишіть їх. Замість цього використовуйте параметризовані запити.

ЕкранОзначаєКоли вам це потрібноУ контексті
'''Лапки всередину рядка буквально — подвойте її'O''Brien'
"order"orderЗарезервоване слово, що використовується як назва стовпцяПодвійні лапки — стандарт; SQL Server використовує [brackets].
`order`orderТе саме в MySQL й MariaDB
\%%Літеральний % всередину шаблону LIKE
\__Літеральний _ всередину шаблону LIKE
$tag$ … $tag$'PostgreSQL доларовий лапки — без екранування всередину взагаліКорисно для органів коду, де подвоєння кожного лапки нечитаний.

Аргументи оболонки

6

Одиничні лапки буквальні, подвійні лапки все ще розширюють змінні.

ЕкранОзначаєКоли вам це потрібноУ контексті
'…'$ ` \Все всередину буквальнеНайбезпечніший лапки — але воно не може містити одиничні лапки.
"…"* ? spaceГлобуси й пробіли безпечні, змінні все ще розширюютьAlways quote variables: "$var", never bare $var.
\ Пробіл у невідзначеному імені файлу
\$$Літеральний знак долара всередину подвійних лапок
\``Літеральний зворотний слеш, а не заміна команди
'\'''Одиничні лапки всередину одиничних лапокЗакрити, екранувати, повторно відкрити — немає способу гніздувати його безпосередньо.

FAQ

Чому мій JSON ламається на шляху Windows?
Тому що зворотний слеш починає послідовність екранування в рядку JSON, тож C:\dir читається як C, потім невалідне екранування. Правильно написане значення — "C:\\dir" — два зворотні слеші в файлі, один у розібраному рядку. Прямі слеші також працюють на Windows і уникають проблеми цілком.
Чи правильно %20 або + для пробілу в URL?
Обидва, в різних місцях. %20 правильно в будь-якому місці URL. Знак плюса означає пробіл лише всередину рядка запиту, закодованого як application/x-www-form-urlencoded — у сегменті шляху це буквальний плюс. Використовуйте %20, коли ви не впевнені, тому що це правильно скрізь.
Як поставити лапки всередину поля CSV?
Обгорніть поле в лапки й подвойте внутрішню: "say ""hi""". Це RFC 4180, і саме тому CSV, повний подвоєних лапок, не пошкоджений. Зворотний слеш нічого не означає для відповідного парсера CSV.
Яка мета апострофа на початку рядка формули CSV?
Він дезактивує впровадження формули. Клітинка, що починається з =, +, - або @, виконується як формула при відкритті файлу в електронній таблиці, тож значення на кшталт =SUM(A1) із ненадійного джерела стає кодом. Префіксний апостроф змушує клітинку читатись як текст.
Чи варто екранувати SQL вручну?
Ні. Подвоєння лапок задокументовано тут, тому що вам потрібно читати екранований SQL, а не писати його — використовуйте параметризовані запити й дозвольте драйверу обробити значення. Ручне екранування — це звідки береться впровадження SQL, і немає версії його, що безпечна при перевірці.