Экранирование символов

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Экранирование символов — замена в тексте управляющих (служебных) символов на соответствующие им последовательности символов. Позволяет включить в текст такие символы, которые не могут быть включены в текст непосредственно. Например, если считается, что текст начинается кавычкой и заканчивается кавычкой, то не экранированная кавычка в тексте будет воспринята как признак конца текста, а не как символ текста, должна быть экранирована, чтобы восприниматься как символ текста. Экранирующий символ — символ, записываемый перед управляющим символом, чтобы управляющий символ считался не управляющим, а символом текста, часть управляющей последовательности символов.

Определение[править | править код]

Обычно тексты на языках программирования, на текстовых командных интерфейсах, на языках разметок текста (HTML, TeX, wiki-разметка) являются структурированными текстами — текстами, в которых некоторые символы (и их комбинации) используются в качестве управляющих, в том числе управляющих структурой текста. Если необходимо использовать управляющий символ в качестве «обычного символа языка», применяют экранирование.

Условно выделяют три типа экранирования:

  • экранирование одиночного символа;
  • экранирование последовательности символов с помощью последовательностей символов «начать экранирование», «конец экранирование»;
  • экранирование с помощью последовательности символов «начать экранирование» и такого символа «конец экранирования», который задаётся до начала экранируемого текста.

Отсутствие экранирования как причина уязвимости[править | править код]

Необходимо экранировать управляющие символы в автоматически генерируемом структурированном тексте. На практике управляющие символы в текстах могут встречаться редко. Например, теоретически имя пользователя не должно содержать управляющих символов. Программист, желая упростить программу, может не реализовать экранирование входных данных. Злоумышленники, желая получить доступ к системе, могут подавать на вход программе произвольные символы, включая управляющие. Упрощённая программа имеет скрытую уязвимость. Стороннее лицо (автор строковых данных) получает возможность влиять на структуру генерируемого текста. Уязвимость становится серьёзной, если созданный текст является чьей-то программой. Традиционно таким проблемам подвержены системы, использующие языки SQL (смотрите SQL-injection) и HTML (смотрите cross site scripting).

Примеры[править | править код]

Экранирование одиночного символа[править | править код]

  • В строковых литералах языка Си, в некоторых строковых литералах языка python, в оболочке unix-подобной ОС экранирующим символом является символ '\' (символ обратного слеша, бэкслеш), записывается перед экранируемым символом, может экранировать себя (то есть, для включения символа '\' в строку в строку включается последовательность символов '\\').
  • В командной строке ОС microsoft windows экранирующим является символ '^', записывается перед экранируемым символом.

Экранирование группы символов[править | править код]

  • В языке программирования python экранирование последовательности символов в строке осуществляется указанием буквы «r» (от англ. raw — необработанный) перед строкой, т. е. символы экранируются последовательностями r"экранируемый текст".
  • В вики-разметке экранирование текста осуществляется с помощью псевдотегов <nowiki> и </nowiki>. Если нужно записать сам псевдотег <nowiki>, это делается символами подстановки (&lt;nowiki&gt;).

Экранирование текста с завершающим символом[править | править код]

Когда в тексте много управляющих символов, будет много знаков экранирования; текст станет тяжеловесным. В таких случаях используют экранирование с завершающим текстом. Тогда управляющие символы считаются символами текста (не несут управляющих функций), а текст кончается, когда компилятор обнаруживает некоторую последовательность — завершающий текст.

<![CDATA[<sender>John Smith</sender>]]>;
  • Многострочные литералы в PHP
$qry = <<<END
SELECT id
FROM `$aTableName`
WHERE `$aFieldName`='$sqFieldValue';
END;

См. также[править | править код]