Каковы некоторые рекомендации по обеспечению безопасности ответственного сеанса с помощью PHP? Там есть информация по всему Интернету, и пришло время, когда все приземлилось в одном месте!Безопасность сеанса PHP
ответ
Есть несколько вещей, которые нужно сделать для того, чтобы сохранить свою сессию безопасным:
- Использовать SSL при аутентификации пользователей или выполнения конфиденциальных операций.
- Регенерировать идентификатор сеанса всякий раз, когда уровень безопасности изменяется (например, вход в систему). Вы можете даже восстановить идентификатор сеанса каждый запрос, если хотите.
- Есть сеансы тайм-аут
- Не использовать регистр глобалам
- параметры аутентификации магазин на сервере. То есть, не отправляйте такие детали, как имя пользователя в cookie.
- Проверьте
$_SERVER['HTTP_USER_AGENT']
. Это добавляет небольшой барьер для захвата сессии. Вы также можете проверить IP-адрес. Но это создает проблемы для пользователей, которые меняют IP-адрес из-за балансировки нагрузки на несколько интернет-соединений и т. Д. (Что имеет место в нашей среде здесь). - Блокировка доступа к сессиям в файловой системе или использовать пользовательские обработки
- Для чувствительных операций сессии рассмотреть вопрос о необходимости зарегистрированных пользователей, чтобы предоставить информацию authenication снова
Один из оснований заключается в вызове каждый раз, когда уровень безопасности сеанса изменяется. Это помогает предотвратить захват сеанса.
Я думаю, что одна из основных проблем (которая рассматривается в PHP 6) - register_globals. В настоящее время одним из стандартных методов, используемых для избежания register_globals
, является использование массивов $_REQUEST
, $_GET
или $_POST
.
«Правильный» способ сделать это (начиная с 5.2, хотя он немного глючит, но стабильный с 6, который скоро появится) проходит через filters.
Таким образом, вместо:
$username = $_POST["username"];
вы могли бы сделать:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
или даже просто:
$username = filter_input(INPUT_POST, 'username');
Это довольно тривиально и очевидно, но обязательно session_destroy после каждый использование. Это может быть сложно реализовать, если пользователь не выходит из системы явно, поэтому для этого можно установить таймер.
Вот хороший tutorial на setTimer() и clearTimer().
Основная проблема с сеансами PHP и безопасностью (помимо захвата сеанса) заключается в том, в какой среде вы находитесь. По умолчанию PHP хранит данные сеанса в файле в каталоге temp OS. Без какой-либо особой мысли или планирования это общедоступный для чтения каталог, поэтому вся ваша информация о сеансе является общедоступной для всех, у кого есть доступ к серверу.
Что касается обслуживания сеансов на нескольких серверах. В этот момент было бы лучше переключить PHP на сеансы, обработанные пользователем, где он вызывает ваши предоставленные функции для CRUD (создания, чтения, обновления, удаления) данных сеанса. В этот момент вы можете сохранить информацию о сеансе в базе данных или решении типа memcache, чтобы все серверы приложений имели доступ к данным.
Сохранение ваших собственных сеансов также может быть выгодным, если вы находитесь на общем сервере, потому что он позволит вам хранить его в базе данных, в которой вы часто чаще контролируете файловую систему.
Я хотел бы проверить как IP и агента пользователя, чтобы увидеть, если они меняют
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
|| $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
//Something fishy is going on here?
}
IP может законно измениться, если пользователь находится за балансировкой нагрузки фермы. – Kornel 2008-11-16 14:42:53
Использование IP-адреса на самом деле не самая лучшая идея в моем опыте. Например; мой офис имеет два IP-адреса, которые используются в зависимости от нагрузки, и мы постоянно сталкиваемся с проблемами с использованием IP-адресов.
Вместо этого я решил сохранить сеансы в отдельной базе данных для доменов на моих серверах. Таким образом, никто из файловой системы не имеет доступа к этой информации о сеансе. Это было действительно полезно с phpBB до 3.0 (с тех пор они исправили это), но это все еще хорошая идея, я думаю.
Если вы используете session_set_save_handler(), вы можете установить собственный обработчик сеанса. Например, вы можете хранить свои сессии в базе данных. Обратитесь к php.net comments для примеров обработчика сеанса базы данных.
Сессии DB также хороши, если у вас несколько серверов, если вы используете сеансы на основе файлов, вам нужно убедиться, что каждый веб-сервер имеет доступ к одной и той же файловой системе для чтения/записи сеансов.
Вы должны быть уверены, что данные сессии, безопасно. Просмотрев ваш php.ini или используя phpinfo(), вы можете найти настройки сеанса. _session.save_path_ сообщает вам, где они сохранены.
Проверьте разрешение папки и ее родителей. Он не должен быть общедоступным (/ tmp) или доступен другим веб-сайтам на вашем общем сервере.
Предполагая, что вы все еще хотите использовать сеанс php, вы можете настроить php на использование другой папки, изменив _session.save_path_ или сохраните данные в базе данных, изменив _session.save_handler_.
Вы можете быть в состоянии установить _session.save_path_ в вашем php.ini (некоторые провайдеры позволяют это) или для апача + mod_php, в файле .htaccess в вашем сайте корневой папке: php_value session.save_path "/home/example.com/html/session"
. Вы также можете установить его во время выполнения с помощью _session_save_path() _.
Отметьте Chris Shiflett's tutorial или Zend_Session_SaveHandler_DbTable для установки и альтернативного обработчика сеанса.
This session fixation paper имеет очень хорошие указатели, где может наступить атака. См. Также session fixation page at Wikipedia.
Мои два (или более) центов:
- Trust нет входного фильтра один
- , избежать вывода (куки, данные сеанса ваш вход тоже)
- Избегайте XSS (держать ваш HTML хорошо сформировавшимися , посмотрите на PHPTAL или HTMLPurifier)
- Defense in depth
- не подвергайте данные
В этой теме есть небольшая, но хорошая книга: Essential PHP Security by Chris Shiflett.
Essential PHP Security http://shiflett.org/images/essential-php-security-small.png
На домашней странице книги вы найдете некоторые интересные примеры кода и образцы глав.
Вы можете использовать технику упомянутых выше (IP & UserAgent), описанный здесь: How to avoid identity theft
Я установил мои сеансы вверх, как this-
на странице авторизации:
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);
(фраза, определенная на странице конфигурации)
затем на заголовке, который находится на всей остальной части сайта:
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {
session_destroy();
header('Location: http://website login page/');
exit();
}
php.ini
session.cookie_httponly = 1
change session name from default PHPSESSID
эк Apache добавить заголовок:
X-XSS-Protection 1
- 1. Безопасность переменной сеанса PHP
- 2. Безопасность сеанса
- 3. безопасность сеанса в ООП/MVC
- 4. Безопасность хранения сеанса
- 5. Безопасность захвата сеанса
- 6. Удаление сеанса весной Безопасность
- 7. Безопасность аутентификации токена сеанса
- 8. Безопасность файла сеанса
- 9. безопасность сеанса для разных областей
- 10. Повышает ли безопасность идентификатора сеанса?
- 11. Безопасность сеанса и ASP.NET Ajax
- 12. PHP - Сессии - Безопасность
- 13. безопасность php-страницы
- 14. PHP - моя безопасность CMS
- 15. Надлежащая безопасность при создании сеанса PHP, который никогда не истекает
- 16. Безопасность в PHP
- 17. Упрощение упрощения сеанса Php
- 18. Проверка идентификатора сеанса - Безопасность - Ионная/Угловая
- 19. Как прокси-сервер сеанса Facebook улучшает безопасность?
- 20. Безопасность сеанса для входа пользователя в систему
- 21. Как обеспечить безопасность потоков для атрибутов сеанса
- 22. Весенняя безопасность OAuth2 - аннулирование сеанса после аутентификации
- 23. POST PHP Безопасность, как предотвратить
- 24. Сбой сеанса PHP или сеанс PHP-сеанса
- 25. Безопасность и php
- 26. PHP Запланированная задача Безопасность
- 27. Безопасность PHP для каталогов
- 28. PHP Контактная форма безопасность
- 29. PHP + jQuery безопасность игры
- 30. Безопасность PHP POST Array
Это не имеет никакого отношения к вопросу вообще. – 2009-08-12 04:02:00
Действительно? Тогда почему в принятом ответе они упоминают не использовать регистровые глобалы? Не было бы, по мнению большинства разработчиков-разработчиков, регистрировать глобальные переменные и обрабатывать переменные формы под эгидой «сеансов», даже если это не является технически частью объекта «сеанс»? – cmcculloh 2009-08-18 18:06:37
-1 Это не отвечает на вопрос. – Tomas 2010-08-17 14:54:43