Как предотвратить XSS в атрибутах - PullRequest
6 голосов
/ 15 августа 2011

поэтому у меня есть сайт, где пользователи могут зарегистрироваться, используя выбранное им имя пользователя, и могут отправлять большие блоки текста и добавлять комментарии. В настоящее время для предотвращения 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-теги, не удаляя такие вещи, как «Я> ты»?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 15 августа 2011

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

  1. Вход фильтра
  2. Выход Escape

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

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

1 голос
/ 16 августа 2011

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

См. Шпаргалку по профилактике OWASP XSS, чтобы узнать, как скрыться в различных контекстах.

...