Той самий символ — наприклад, подвійна лапка — потрібно екранувати по-різному залежно від того, куди вставляється текст: у рядок JavaScript, у значення JSON, у команду shell чи в патерн регулярного виразу. Причина в тому, що кожен контекст має власний синтаксис із власним набором спецсимволів.
Екранування в рядку JavaScript/JSON
У рядкових літералах JS і в JSON спецсимволи екранують зворотним слешем: \" для лапки, \n для переносу рядка, \\ для самого зворотного слешу. JSON додатково вимагає, щоб усі рядки були в подвійних лапках — на відміну від JS, де допустимі й одинарні.
Екранування в shell-командах
У командному рядку спецсимволами є пробіл, лапки, знак долара, зірочка та інші — вони мають особливе значення для оболонки (shell). Пробіл в аргументі команди потрібно екранувати або взяти весь аргумент у лапки, інакше оболонка розділить його на два окремих аргументи.
Екранування в регулярних виразах
У регулярних виразах символи на кшталт крапки, зірочки чи круглих дужок мають спеціальне значення (будь-який символ, квантифікатор, група). Щоб знайти їх буквально, а не як метасимволи, перед ними ставлять зворотний слеш: \. знаходить крапку, а не «будь-який символ».
Навіщо потрібне окреме екранування для кожного контексту
Помилка «подвійного екранування» чи «недостатнього екранування» — одна з найчастіших причин зламаного коду при вставці тексту користувача (наприклад, шляху до файлу з пробілом) у команду чи рядок. Правильне екранування залежить від того, куди саме вставляється текст, а не від самого тексту.
Навіщо це потрібно
- Підготувати текст користувача для безпечної вставки в JSON-запит.
- Сформувати shell-команду з динамічним аргументом без ризику ін’єкції команд.
- Екранувати спецсимволи перед використанням тексту як буквального патерну в регулярному виразі.
Подвійне екранування у вкладених контекстах
Якщо текст проходить через два контексти послідовно — наприклад, рядок вставляється в JSON, а той JSON передається як аргумент shell-команди — екранувати потрібно в правильному порядку: спершу для внутрішнього контексту (JSON), потім для зовнішнього (shell). Переплутаний порядок чи пропущений один із рівнів — типова причина, чому «правильно екранований» рядок все одно ламається на практиці.