работа с htmlescape / htmlspecialchars - PullRequest
1 голос
/ 13 февраля 2012

Чтобы предотвратить XSS, всякий раз, когда вы выводите обратно пользовательский ввод (как вы делаете при отображении того, что было введено неправильно, или при перерисовке формы с ранее представленными значениями), вам необходимо экранировать html.Это точно ...

поэтому делать что-то вроде

echo "the name which was supplied as {$_GET['company_name']} is not accepted" 

было бы неправильно.

Вместо этого мы бы сделали это.

echo "the name which was supplied as " . htmlspecialchars($_GET['company_name']) . " is not accepted" 

Имея это в виду, здесь возникает мой вопрос; что вы делаете, когда $ _GET ['company_name'] необходимо отобразить обратно в текстовое поле, откуда он начался?может быть, вы хотите, чтобы ваш пользователь исправил это название компании только потому, что оно слишком длинное?

, если бы вы использовали htmlspecialchars, и если имя_компании было бы, скажем, AT & T, то "& там" сбежало бы и выглядело как & amp;Не так ли?

Итак, как нам справиться с этой ситуацией?Конечно, можно сказать, что не получайте htmlspecialchar, просто верните его как есть?

но тогда кто-то может выслать нам имя компании, которое тщательно обработано, чтобы остановить текстовое поле, запустить javascript и нажать XSS оттуда.

Как вы справляетесь с htmlescape в этих ситуациях?Просто используйте history.go (-1)?

1 Ответ

1 голос
/ 26 февраля 2013

Я настоятельно рекомендую вам проверить Шпаргалку по профилактике 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" вы не увидите &amp; в поле ввода. Это связано с тем, что в контексте атрибута HTML ваш браузер отображает объекты HTML (например, &amp;) как связанные с ними символы (например, &).

Когда вы можете увидеть &amp; в текстовом поле?

Если вы измените значение ввода с помощью JavaScript, ваш браузер будет использовать другой набор правил для определения того, как будет обрабатываться новое значение. Если вы хотите, чтобы HTML экранировал 'AT & T', а затем вставил это новое значение, используя что-то вроде, напр. yourInput.setAttribute(“value”, HtmlEscapingFunction('AT&T')), пользователь будет см. AT&amp;T. Это происходит потому, что вы сейчас работаете в контексте выполнения DOM, а в контексте выполнения DOM HTML, экранирующий значение атрибута, вызывает двойное кодирование.

...