Xml Escapeing/Encoding терминология

Меня смущает различие между терминами "экранирование" и "кодировка" в таких фразах, как:

Кодировка XML

Xml Escape

Кодированный HTML

Избежавший URL

...

Кто-нибудь может мне это объяснить?

3 ответа

Решение

Кодировка описывает, как символы файла физически записываются в двоичном формате (как в Unicode или ANSI).

Экранирование относится к процессу замены специальных символов (таких как < а также >) с их эквивалентом сущности XML (таким как &lt; а также &gt;). Для 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 символа.

Лично я считаю, что более уместно называть общий процесс "кодированием", так как вы создаете код, который будет передаваться по каналу связи (фрагмент кода разметки / программирования) и интерпретироваться получателем (анализатором). Я думаю, что глупо заменять < с чем-то совершенно другим, как &#60; и назовите это "побег".

Другие вопросы по тегам