Усі статті

String Escape: чому той самий текст треба екранувати по-різному

Той самий символ — наприклад, подвійна лапка — потрібно екранувати по-різному залежно від того, куди вставляється текст: у рядок JavaScript, у значення JSON, у команду shell чи в патерн регулярного виразу. Причина в тому, що кожен контекст має власний синтаксис із власним набором спецсимволів.

Екранування в рядку JavaScript/JSON

У рядкових літералах JS і в JSON спецсимволи екранують зворотним слешем: \" для лапки, \n для переносу рядка, \\ для самого зворотного слешу. JSON додатково вимагає, щоб усі рядки були в подвійних лапках — на відміну від JS, де допустимі й одинарні.

Екранування в shell-командах

У командному рядку спецсимволами є пробіл, лапки, знак долара, зірочка та інші — вони мають особливе значення для оболонки (shell). Пробіл в аргументі команди потрібно екранувати або взяти весь аргумент у лапки, інакше оболонка розділить його на два окремих аргументи.

Екранування в регулярних виразах

У регулярних виразах символи на кшталт крапки, зірочки чи круглих дужок мають спеціальне значення (будь-який символ, квантифікатор, група). Щоб знайти їх буквально, а не як метасимволи, перед ними ставлять зворотний слеш: \. знаходить крапку, а не «будь-який символ».

Навіщо потрібне окреме екранування для кожного контексту

Помилка «подвійного екранування» чи «недостатнього екранування» — одна з найчастіших причин зламаного коду при вставці тексту користувача (наприклад, шляху до файлу з пробілом) у команду чи рядок. Правильне екранування залежить від того, куди саме вставляється текст, а не від самого тексту.

Навіщо це потрібно

  • Підготувати текст користувача для безпечної вставки в JSON-запит.
  • Сформувати shell-команду з динамічним аргументом без ризику ін’єкції команд.
  • Екранувати спецсимволи перед використанням тексту як буквального патерну в регулярному виразі.

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

Якщо текст проходить через два контексти послідовно — наприклад, рядок вставляється в JSON, а той JSON передається як аргумент shell-команди — екранувати потрібно в правильному порядку: спершу для внутрішнього контексту (JSON), потім для зовнішнього (shell). Переплутаний порядок чи пропущений один із рівнів — типова причина, чому «правильно екранований» рядок все одно ламається на практиці.

Спробувати інструмент