Как предотвратить XSS в атрибутах

поэтому у меня есть сайт, на котором пользователи могут зарегистрироваться, используя имя пользователя по своему выбору, и могут отправлять большие блоки текста и добавлять комментарии. В настоящее время, чтобы предотвратить XSS, я использую strip_tags для данных при вводе в базу данных и вывожу данные только в теле, а не в атрибуте. В настоящее время я вношу изменения в сайт, одним из которых является создание пользовательской страницы, которая загружается, когда кто-то нажимает на имя пользователя (ссылку). Это будет выглядеть так:

<a href="example.com/user/<?php echo $username; ?>">...</a>

Я беспокоюсь, что для переменной $username кто-то может вставить

<a href="example.com/user/user" onClick="javascript:alert('XSS');">...</a>

Я прочитал кучу других сообщений SO об этом, но ни один из них не дал черно-белого ответа. Если я использую следующее для всего текста на выходе, в дополнение к strip_tags на входе:

echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');

этого будет достаточно, чтобы остановить все XSS-атаки, включая те, которые используют встроенный синтаксис javascript:?

Кроме того, есть ли способ удалить фактические теги html, не удаляя такие вещи, как «Я> ты»?

Спасибо!


person user887068    schedule 15.08.2011    source источник
comment
+1 за заботу о безопасности!   -  person jtbandes    schedule 15.08.2011


Ответы (2)


Побег зависит от контекста. Если это URL-адрес, используйте кодировку URL-адреса (%xx), но также убедитесь, что полный URL-адрес не начинается с «javascript:». Ваш синтаксис для атрибута onclick не требуется. Onclick — это обработчик событий javascript, поэтому любой javascript внутри него будет работать.

См. Памятку OWASP по предотвращению XSS, чтобы узнать, как выйти из ситуации в различных контекстах.

person Erlend    schedule 16.08.2011
comment
Если, например, мой код: $user = 'asdf onClick=alert(\'XSS\');'; echo '‹a href=/user/$user›...‹/a›'; Это приведет к ‹a href=/user/asdf onClick=alert('XSS');› Итак, PHP-функция urlencode($user) исправит это? - person user887068; 18.08.2011
comment
Протестировать и посмотреть? :-) ‹a href=/user/asdf%22+onClick%3D%22alert%28%27XSS%27%29%3B%22›...‹/a› - person Erlend; 18.08.2011

Согласно Руководству по изучению сертификации PHP5, существует два золотых правила безопасности:

  1. Входной фильтр
  2. Выход выхода

В данный момент вы смотрите только на одну сторону проблемы.

Но я бы предпочел htmlentities.

person Andreas    schedule 15.08.2011
comment
Зачем использовать htmlentities вместо htmlspecialchars? - person user887068; 15.08.2011
comment
Эта функция идентична htmlspecialchars() во всех отношениях, за исключением того, что с htmlentities() все символы, которые имеют эквиваленты символов HTML, преобразуются в эти объекты. Это также предпочтительный метод экранирования для Zend. Согласно вышеупомянутому учебному пособию. - person Andreas; 15.08.2011
comment
Я понимаю разницу, я просто имею в виду, есть ли реальная причина использовать один над другим? - person user887068; 15.08.2011
comment
Никто, что я действительно испытал. Но на мой взгляд, иногда просто полезно послушать чужие советы. - person Andreas; 15.08.2011