Каковы лучшие практики для предотвращения атак xss на сайте PHP - PullRequest
65 голосов
/ 16 сентября 2008

Я настроил PHP так, что магические кавычки включены, а глобальные регистры отключены.

Я прилагаю все усилия, чтобы всегда вызывать htmlentities () для всего, что я выводил, полученного из пользовательского ввода.

Я также иногда ищу свою базу данных для общих вещей, используемых в xss, таких как ...

<script

Что еще я должен делать и как я могу убедиться, что то, что я пытаюсь сделать, всегда сделано.

Ответы [ 20 ]

2 голосов
/ 17 сентября 2008

Все эти ответы великолепны, но, по сути, решением XSS будет прекращение генерации HTML-документов путем манипулирования строками.

Фильтрация входных данных всегда хорошая идея для любого приложения.

Экранирование вашего вывода с помощью htmlentities () и друзей должно работать до тех пор, пока он используется должным образом, но это HTML-эквивалент создания SQL-запроса путем объединения строк с mysql_real_escape_string ($ var) - это должно работать, но меньше вещей может Если можно так выразиться, проверьте свою работу по сравнению с подходом, подобным использованию параметризованных запросов.

Долгосрочное решение должно состоять в том, чтобы приложения создавали внутреннюю страницу, возможно, используя стандартный интерфейс, такой как DOM, а затем использовали библиотеку (например, libxml) для обработки сериализации в XHTML / HTML / и т.д. Конечно, мы далеки от того, чтобы быть популярными и достаточно быстрыми, но в то же время мы должны создавать наши HTML-документы с помощью строковых операций, и это по своей природе более рискованно.

2 голосов
/ 16 сентября 2008

Экранирование всего пользовательского ввода достаточно для большинства сайтов. Также убедитесь, что идентификаторы сеанса не попадают в URL, чтобы их нельзя было украсть из ссылки Referer на другой сайт. Кроме того, если вы разрешаете своим пользователям отправлять ссылки, убедитесь, что не разрешены javascript: ссылки протокола; они выполнят скрипт, как только пользователь нажмет на ссылку.

2 голосов
/ 17 сентября 2008

Я считаю, что использование этой функции помогает исключить множество возможных xss атак http://www.codebelay.com/killxss.phps

1 голос
/ 24 апреля 2011

Лучшим текущим методом предотвращения XSS в приложении PHP является HTML Purifier (http://htmlpurifier.org/). Один незначительный недостаток - это то, что это довольно большая библиотека, и ее лучше всего использовать с кэшем кода операции, таким как APC. в любом месте, где на экран выводится ненадежное содержимое. Это гораздо более тщательно, чем htmlentities, htmlspecialchars, filter_input, filter_var, strip_tags и т. д.

1 голос
/ 20 апреля 2010

Вы должны как минимум проверить все данные, поступающие в базу данных. И попробуйте проверить все данные, покидающие базу данных тоже.

mysql_real_escape_string хороша для предотвращения внедрения SQL, но XSS сложнее. Вы должны использовать preg_match, assign_tags или htmlentities, где это возможно!

1 голос
/ 16 сентября 2008

Сделайте вам любые сеансовые куки (или все куки), которые вы используете HttpOnly. В этом случае большинство браузеров скрывают значение cookie от JavaScript. Пользователь по-прежнему может вручную копировать файлы cookie, но это помогает предотвратить прямой доступ к сценарию. У StackOverflow была эта проблема во время бета-тестирования.

Это не решение, просто еще один кирпич в стене

1 голос
/ 17 сентября 2008
  • Не доверяйте вводу пользователя
  • Выход из режима произвольного текста
  • Не используйте magic_quotes; посмотрите, есть ли вариант, специфичный для СУБД, или используйте PDO
  • Подумайте об использовании файлов cookie только для HTTP, чтобы по возможности избежать любого вредоносного сценария, способного перехватить сеанс
0 голосов
/ 16 сентября 2008

Используйте существующую пользовательскую библиотеку очистки для очистки всех пользовательских данных. Если вы не приложите много усилий, реализация этого самостоятельно никогда не сработает.

0 голосов
/ 17 сентября 2008

Трудно реализовать полное предотвращение инъекций sql / xss на сайт, который не вызывает ложных срабатываний. В CMS конечный пользователь может захотеть использовать <script> или <object>, который ссылается на элементы с другого сайта.

Я рекомендую всем пользователям установить FireFox с NoScript; -)

0 голосов
/ 17 сентября 2008

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

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