Xml Escapeing/Encoding терминология
Меня смущает различие между терминами "экранирование" и "кодировка" в таких фразах, как:
Кодировка XML
Xml Escape
Кодированный HTML
Избежавший URL
...
Кто-нибудь может мне это объяснить?
3 ответа
Кодировка описывает, как символы файла физически записываются в двоичном формате (как в Unicode или ANSI).
Экранирование относится к процессу замены специальных символов (таких как <
а также >
) с их эквивалентом сущности XML (таким как <
а также >
). Для URL экранирование означает замену символов на строки, начинающиеся с %
, такие как %20
для одного пробела.
Экранирование отличается по языку, но кодировки обычно являются общепринятыми стандартами. Иногда термины используются неоднозначно (особенно с кодировкой, используемой для обозначения экранирования), но они хорошо определены и различны.
В каждом веб-приложении данные состоят из различных уровней, таких как уровень представления, уровень модели, уровень базы данных и т. Д. Каждый уровень "предполагается" разрабатывать независимо, чтобы удовлетворять различным требованиям масштабируемости и удобства обслуживания.
Теперь, по сути, каждый слой должен "общаться" друг с другом, и они должны выбрать язык, на котором они могут говорить. Это называется кодированием. Существуют различные типы кодировок, такие как ASCII, UTF-8, UTF-16 и т. Д. Теперь, если пользователь, например, является китайцем или японцем, ASCII для него не будет работать, поэтому он продолжит работу с UTF-16 или любым другим. другая техника кодирования, которая гарантировала бы общение на китайском языке. Таким образом, из веб-уровня китайские иероглифы будут проходить через бизнес-уровень, а затем - на уровень данных, и везде будет использоваться одна и та же схема "кодирования".
Зачем?
Теперь предположим, что ваш веб-уровень отправляет данные в UTF-16, поддерживающем китайский язык, но уровень базы данных принимает только ASCII, тогда уровень базы данных будет сбит с толку относительно того, о чем вы говорите! он понимает только английские символы, он не понимает остальных. Это было о кодировании.
Побег:
Существует определенный набор данных, называемый "метаданными", которые имеют особое значение с точки зрения браузера. Например, <>
являются метаданными с точки зрения браузера. Парсер браузеров знает, что все данные, содержащиеся в этих <>
должны быть истолкованы. Теперь злоумышленники используют эту технику, чтобы сбить с толку браузеры. Например:
<input type="text" value="${name} />
если я заменю имя на
name="/><script>alert(document.cookie)</script>
Тогда результирующий код, как его видит браузер, будет
<input type="text" value=""/><script>alert(document.cookie)</script> />
Значит, теперь вам нужно указать браузеру, что все, что я положил в name=""
должен быть "экранирован" или должен рассматриваться только как данные. Так что есть различные функции, которые либо кодируют / экранируют <>
как их HTML-эквивалент %3C%3E
Теперь браузер знает, что к этому нужно относиться иначе. По сути, избегать означает избегать их реального значения (грубо говоря).
<input type="text" value="${fn:escapeXML(name)} />
используя JSTL.
TL;DR Оба термина взаимозаменяемы (если вы имеете в виду преобразование некоторых символов, чтобы они интерпретировались как простые строковые данные). Эта дискуссия старая. Из CWE-116: неправильное кодирование или экранирование вывода:
Использование терминов "кодирование" и "экранирование" широко варьируется. Например, в некоторых языках программирования термины используются взаимозаменяемо, в то время как другие языки предоставляют API, которые используют оба термина для различных задач. Это пересекающееся использование распространяется и на Web, например, на функцию "escape" JavaScript, целью которой является кодирование. Конечно, концепции кодирования и экранирования предшествуют Интернету на десятилетия. Учитывая такой контекст, CWE трудно принять последовательный словарь, который не будет неверно истолкован некоторыми участниками.
Достаточно комично JavaScript также имеет encodeURIComponent()
и его спецификация полностью исключает дискуссию:
Функция encodeURIComponent вычисляет новую версию URI, в которой каждый экземпляр определенных символов заменяется одной, двумя, тремя или четырьмя escape-последовательностями, представляющими кодировку UTF-8 символа.
Лично я считаю, что более уместно называть общий процесс "кодированием", так как вы создаете код, который будет передаваться по каналу связи (фрагмент кода разметки / программирования) и интерпретироваться получателем (анализатором). Я думаю, что глупо заменять <
с чем-то совершенно другим, как <
и назовите это "побег".