Существуют ли другие последовательности, которые браузеры интерпретируют как специальные символы HTML? - PullRequest
6 голосов
/ 24 декабря 2011

В HTML есть несколько специальных символов < > & ' ", которые имеют значение для анализатора DOM.Это символы, которые популярные функции, такие как PHP * htmlspecialchars , преобразуют в HTML-объекты, чтобы они случайно не вызывали что-либо при разборе.

Выполненные переводы:

  • '&' (амперсанд) становится &amp;
  • " (двойная кавычка) становится &quot;, когда ENT_NOQUOTES не установлен.
  • ' (одинарная кавычка)) становится &#039; только при установленном ENT_QUOTES.
  • '<' (меньше чем) становится <code>&lt;
  • '>' (больше чем) становится &gt;

Однако я помнючто в более старых браузерах, таких как IE6, были также другие последовательности байтов , из-за которых анализатор DOM браузера интерпретировал содержимое как HTML .

Это все ещепроблема сегодня?Если отфильтровать только эти 5, достаточно ли этого для предотвращения XSS?

Например, вот все известные комбинации символа "<" в HTML и JavaScript (в UTF-8). </p>

<
%3C
&lt
&lt;
&LT
&LT;
&#60
&#060
&#0060
&#00060
&#000060
&#0000060
&#60;
&#060;
&#0060;
&#00060;
&#000060;
&#0000060;
&#x3c
&#x03c
&#x003c
&#x0003c
&#x00003c
&#x000003c
&#x3c;
&#x03c;
&#x003c;
&#x0003c;
&#x00003c;
&#x000003c;
&#X3c
&#X03c
&#X003c
&#X0003c
&#X00003c
&#X000003c
&#X3c;
&#X03c;
&#X003c;
&#X0003c;
&#X00003c;
&#X000003c;
&#x3C
&#x03C
&#x003C
&#x0003C
&#x00003C
&#x000003C
&#x3C;
&#x03C;
&#x003C;
&#x0003C;
&#x00003C;
&#x000003C;
&#X3C
&#X03C
&#X003C
&#X0003C
&#X00003C
&#X000003C
&#X3C;
&#X03C;
&#X003C;
&#X0003C;
&#X00003C;
&#X000003C;
\x3c
\x3C
\u003c
\u003C

Ответы [ 3 ]

4 голосов
/ 24 декабря 2011

Нет. Я действительно изучал это, когда я искал использование CSS и атрибутов для автоматического назначения стилей на основе контента ( мой вопрос ), и короткий ответ - нет. Современные браузеры не позволяют использовать «байтовые последовательности» в качестве HTML. Я слегка использую «байтовые последовательности», потому что в коде наибольшего риска не используются байтовые значения.

Примеры, перечисленные на сайте XSS, касаются использования атрибутов и интерпретации JavaScript как строки, которая требует выполнения. Но также перечислены такие вещи, как &{alert('XSS')}, который запускает код в скобках, и этот код не работает в современных браузерах.

Но чтобы ответить на ваш второй вопрос, нет, фильтрации этих 5 недостаточно, чтобы предотвратить атаку XSS. Бросайте свой код через код специальных символов PHP HTML всегда, но есть сотни байтовых кодов, которые можно использовать , и вы не сможете ничего гарантировать. Отправка через PHP-фильтр (особенно htmlentities()) даст вам точный текст, введенный при выводе его в HTML (IE &laquo; вместо "). При этом в большинстве случаев, в зависимости от вашего использования, используется htmlspecialchars этого достаточно для покрытия большинства атак. Зависит от того, как вы будете использовать ввод, но по большей части это будет безопасно.

XSS - сложная вещь для объяснения. Общее хорошее правило - всегда фильтровать все, что пользователь введет. И используйте белый список вместо черного. То, о чем вы здесь говорите, будет в черном списке этих значений, когда всегда безопаснее предположить, что ваши пользователи злонамеренные и допускают только определенные вещи.

1 голос
/ 27 декабря 2011

Достаточно экранировать текст в HTML, но в HTML существуют контексты, в которых даже текст опасен:

  • не позволяет пользователям создавать произвольные URL (в <a>,<img> и т. Д.), Поскольку они могут вставить javascript: или множество его вариантов.Только белый список ^https?://.

  • Экранирования HTML недостаточно в <script> (в любом случае используется экранирование сущностей) или в атрибутах, выполняющих скрипт (onclick и т. Д.).).Для тех, кому нужно json_encode().

1 голос
/ 25 декабря 2011

Вот пример: <button onclick="confirm('Are you sure you want to delete &#39;);alert(&#39;xss')> Здесь ввод злоумышленников - это то, что идет после «delete» и перед ')>

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

Короче говоря, предотвращение xss означает экранирование для данного контекста.В приведенном выше примере мы находимся в контексте JavaScript в контексте атрибута HTML.См. Шпаргалку по профилактике OWASP XSS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...