2008-08-02 4 views
125

Каковы некоторые рекомендации по обеспечению безопасности ответственного сеанса с помощью PHP? Там есть информация по всему Интернету, и пришло время, когда все приземлилось в одном месте!Безопасность сеанса PHP

ответ

88

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

  1. Использовать SSL при аутентификации пользователей или выполнения конфиденциальных операций.
  2. Регенерировать идентификатор сеанса всякий раз, когда уровень безопасности изменяется (например, вход в систему). Вы можете даже восстановить идентификатор сеанса каждый запрос, если хотите.
  3. Есть сеансы тайм-аут
  4. Не использовать регистр глобалам
  5. параметры аутентификации магазин на сервере. То есть, не отправляйте такие детали, как имя пользователя в cookie.
  6. Проверьте $_SERVER['HTTP_USER_AGENT']. Это добавляет небольшой барьер для захвата сессии. Вы также можете проверить IP-адрес. Но это создает проблемы для пользователей, которые меняют IP-адрес из-за балансировки нагрузки на несколько интернет-соединений и т. Д. (Что имеет место в нашей среде здесь).
  7. Блокировка доступа к сессиям в файловой системе или использовать пользовательские обработки
  8. Для чувствительных операций сессии рассмотреть вопрос о необходимости зарегистрированных пользователей, чтобы предоставить информацию authenication снова
15

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

11

Я думаю, что одна из основных проблем (которая рассматривается в 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'); 
+2

Это не имеет никакого отношения к вопросу вообще. – 2009-08-12 04:02:00

+5

Действительно? Тогда почему в принятом ответе они упоминают не использовать регистровые глобалы? Не было бы, по мнению большинства разработчиков-разработчиков, регистрировать глобальные переменные и обрабатывать переменные формы под эгидой «сеансов», даже если это не является технически частью объекта «сеанс»? – cmcculloh 2009-08-18 18:06:37

+0

-1 Это не отвечает на вопрос. – Tomas 2010-08-17 14:54:43

3

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

Вот хороший tutorial на setTimer() и clearTimer().

3

Основная проблема с сеансами PHP и безопасностью (помимо захвата сеанса) заключается в том, в какой среде вы находитесь. По умолчанию PHP хранит данные сеанса в файле в каталоге temp OS. Без какой-либо особой мысли или планирования это общедоступный для чтения каталог, поэтому вся ваша информация о сеансе является общедоступной для всех, у кого есть доступ к серверу.

Что касается обслуживания сеансов на нескольких серверах. В этот момент было бы лучше переключить PHP на сеансы, обработанные пользователем, где он вызывает ваши предоставленные функции для CRUD (создания, чтения, обновления, удаления) данных сеанса. В этот момент вы можете сохранить информацию о сеансе в базе данных или решении типа memcache, чтобы все серверы приложений имели доступ к данным.

Сохранение ваших собственных сеансов также может быть выгодным, если вы находитесь на общем сервере, потому что он позволит вам хранить его в базе данных, в которой вы часто чаще контролируете файловую систему.

2

Я хотел бы проверить как IP и агента пользователя, чтобы увидеть, если они меняют

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT'] 
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR']) 
{ 
    //Something fishy is going on here? 
} 
+5

IP может законно измениться, если пользователь находится за балансировкой нагрузки фермы. – Kornel 2008-11-16 14:42:53

5

Использование IP-адреса на самом деле не самая лучшая идея в моем опыте. Например; мой офис имеет два IP-адреса, которые используются в зависимости от нагрузки, и мы постоянно сталкиваемся с проблемами с использованием IP-адресов.

Вместо этого я решил сохранить сеансы в отдельной базе данных для доменов на моих серверах. Таким образом, никто из файловой системы не имеет доступа к этой информации о сеансе. Это было действительно полезно с phpBB до 3.0 (с тех пор они исправили это), но это все еще хорошая идея, я думаю.

2

Если вы используете session_set_save_handler(), вы можете установить собственный обработчик сеанса. Например, вы можете хранить свои сессии в базе данных. Обратитесь к php.net comments для примеров обработчика сеанса базы данных.

Сессии DB также хороши, если у вас несколько серверов, если вы используете сеансы на основе файлов, вам нужно убедиться, что каждый веб-сервер имеет доступ к одной и той же файловой системе для чтения/записи сеансов.

2

Вы должны быть уверены, что данные сессии, безопасно. Просмотрев ваш 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 для установки и альтернативного обработчика сеанса.

11

Мои два (или более) центов:

  • 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

3

Я установил мои сеансы вверх, как 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();  
} 
3

php.ini

session.cookie_httponly = 1 
change session name from default PHPSESSID 

эк Apache добавить заголовок:

X-XSS-Protection 1 
Смежные вопросы