Безопасность сеансов PHP

голоса
125

Каковы некоторые рекомендации по поддержанию ответственной безопасности сеанса с PHP? Там в информации по всей сети, и это о время все приземлились в одном месте!

Задан 02/08/2008 в 03:41
источник пользователем
На других языках...                            


13 ответов

голоса
15

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

Ответил 02/08/2008 в 03:43
источник пользователем

голоса
11

Я думаю , что одна из главных проблем (которые в настоящее время рассматриваются в PHP 6) является register_globals. Сейчас один из стандартных методов , используемых , чтобы избежать register_globals, чтобы использовать $_REQUEST, $_GETили $_POSTмассивы.

«Правильный» способ сделать это (как 5.2, хотя это немного глючит, но стабильно , как 6, который в ближайшее время) через фильтры .

Так вместо того, чтобы:

$username = $_POST["username"];

вы могли бы сделать:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

или даже просто:

$username = filter_input(INPUT_POST, 'username');
Ответил 02/08/2008 в 03:55
источник пользователем

голоса
3

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

Вот хороший учебник по SetTimer () и clearTimer ().

Ответил 02/08/2008 в 04:16
источник пользователем

голоса
3

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

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

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

Ответил 03/08/2008 в 14:14
источник пользователем

голоса
2

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

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
Ответил 04/08/2008 в 22:38
источник пользователем

голоса
5

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

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

Ответил 06/08/2008 в 21:44
источник пользователем

голоса
2

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

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

Ответил 09/08/2008 в 04:28
источник пользователем

голоса
88

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

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

голоса
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 () _.

Проверьте учебник Криса Шифлетт в или Zend_Session_SaveHandler_DbTable установить и альтернативный обработчик сеанса.

Ответил 18/08/2008 в 18:12
источник пользователем

голоса
9

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

Ответил 05/03/2009 в 23:33
источник пользователем

голоса
11

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

  • Не доверять никому
  • Фильтр вход, выход побег (куки, данные сеанса ваш вход тоже)
  • Избегайте XSS (держать ваш HTML хорошо сформированы, посмотрите на PHPTAL или HTMLPurifier )
  • Защита в глубину
  • Не подвергайте данные

Существует маленькая , но хорошая книга по этой теме: Essential PHP Security Крис Шифлетт .

Essential PHP Security http://shiflett.org/images/essential-php-security-small.png

На домашней странице книги вы найдете некоторые интересные примеры кода и главы образца.

Вы можете использовать технику упомянутых выше (IP и UserAgent), описанный здесь: Как избежать кражи личных данных

Ответил 06/04/2010 в 17:05
источник пользователем

голоса
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();     
}
Ответил 19/07/2011 в 22:40
источник пользователем

голоса
3

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

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

X-XSS-Protection    1
Ответил 13/10/2011 в 03:40
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more