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


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

 125
Author: mattytommo, 0000-00-00

12 answers

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

  1. Используйте SSL при аутентификации пользователей или выполнении конфиденциальных операций.
  2. Повторно создавайте идентификатор сеанса при каждом изменении уровня безопасности (например, при входе в систему). Вы даже можете повторно создавать идентификатор сеанса при каждом запросе, если хотите.
  3. Время ожидания сеансов истекло
  4. Не используйте глобальные регистры
  5. Храните сведения об аутентификации на сервере. То есть, не отправляйте такие данные, как имя пользователя в файле cookie.
  6. Проверьте $_SERVER['HTTP_USER_AGENT']. Это добавляет небольшой барьер для захвата сеанса. Вы также можете проверить IP-адрес. Но это вызывает проблемы у пользователей, у которых меняется IP-адрес из-за балансировки нагрузки на нескольких подключениях к Интернету и т. Д. (Что имеет место в нашей среде здесь).
  7. Заблокируйте доступ к сеансам в файловой системе или используйте пользовательскую обработку сеансов
  8. Для конфиденциальных операций рассмотрите возможность требовать от вошедших в систему пользователей подтверждения их подлинности снова подробности
 88
Author: grom, 2012-06-06 17:37:35

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

 15
Author: saint_groceon, 2008-08-02 02:43:42

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

  • Никому не доверяй
  • Ввод фильтра, вывод экранирования (файлы cookie, данные сеанса также являются вашими входными данными)
  • Избегайте XSS (сохраняйте свой HTML хорошо сформированным, взгляните на PHPTAL или Очиститель HTML)
  • Глубокая оборона
  • Не раскрывать данные

На эту тему есть небольшая, но хорошая книга: Необходимая безопасность PHP от Криса Шифлетта.

Необходимая безопасность PHP http://shiflett.org/images/essential-php-security-small.png

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

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

 11
Author: takeshin, 2010-04-06 16:25:03

Я думаю, что одна из основных проблем (которая решается в 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');
 11
Author: cmcculloh, 2012-05-04 09:41:40

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

 9
Author: raspi, 2009-03-05 22:33:27

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

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

 5
Author: Eric Lamb, 2008-08-06 20:44:55

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

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

 3
Author: helloandre, 2008-08-02 03:24:12

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

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

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

 3
Author: John Downey, 2008-08-03 13:14:48

Я настраиваю свои сеансы так -

На странице входа в систему:

$_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
Author: Chad, 2011-07-19 22:00:12

Php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

Эквалайзер Apache добавить заголовок:

X-XSS-Protection    1
 3
Author: user956584, 2011-10-13 02:40:01

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

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
 2
Author: Teifion, 2008-08-04 21:38:05
 
Author: ,