В каждом веб-приложении данные состоят из различных уровней, таких как уровень представления, уровень модели, уровень базы данных и т. Д. Каждый уровень «предполагается» разрабатывать независимо, чтобы удовлетворять различным требованиям масштабируемости и удобства обслуживания.
Теперь, по сути, каждый слой должен «общаться» друг с другом, и они должны выбирать язык, на котором они могут говорить.
Это называется кодированием. Существуют различные типы кодировок, такие как 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.