Я настоятельно рекомендую вам проверить Шпаргалку по профилактике OWASP XSS , если вы хотите узнать больше о предотвращении XSS.
Когда браузер отображает HTML (и связанный контент, такой как CSS), он определяет разные контексты визуализации для разных типов ввода. Каждый контекст имеет свою семантику о том, как и когда он может выполнять код скрипта. Таким образом, правила вашего браузера для обработки HTML отличаются от правил, которые он использует для визуализации JavaScript, которые отличаются для правил CSS и так далее. Это означает, что если вы пытаетесь предотвратить XSS, вы должны быть очень чувствительны к контексту, в который вводятся ненадежные данные.
Если вы используете серверный код, такой как PHP, для вывода небезопасных значений в атрибуты HTML (включая значение ввода формы), вам нужно экранировать текст для атрибутов HTML. Предполагая, что страница использует кодировку UTF-8, вы бы сделали что-то вроде:
<input type="text" value="<?php echo htmlspecialchars($_GET['company_name'], ENT_QUOTES, 'UTF-8'); ?>" >
Опция "ENT_QUOTES" важна, потому что она говорит PHP, чтобы HTML экранировал кавычки. Неэкранированные кавычки могут использоваться для «разрыва» атрибута и добавления обработчиков событий JavaScript, таких как «onclick», «onfocus» и т. Д.
В вашем примере "AT & T" вы не увидите &
в поле ввода. Это связано с тем, что в контексте атрибута HTML ваш браузер отображает объекты HTML (например, &
) как связанные с ними символы (например, &).
Когда вы можете увидеть &
в текстовом поле?
Если вы измените значение ввода с помощью JavaScript, ваш браузер будет использовать другой набор правил для определения того, как будет обрабатываться новое значение. Если вы хотите, чтобы HTML экранировал 'AT & T', а затем вставил это новое значение, используя что-то вроде, напр. yourInput.setAttribute(“value”, HtmlEscapingFunction('AT&T'))
, пользователь будет см. AT&T
. Это происходит потому, что вы сейчас работаете в контексте выполнения DOM, а в контексте выполнения DOM HTML, экранирующий значение атрибута, вызывает двойное кодирование.