Вопрос безопасности PHP-сессии - PullRequest
2 голосов
/ 21 августа 2011

Я проводил некоторые исследования в StackOverflow о том, как правильно настроить сеансы и предотвратить угон и т. Д. Я нашел ответ, который кто-то разместил на одном из вопросов, и он предоставил следующий код:

Для случая, когда пользователь входит в систему и совпадают имя пользователя и пароль

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] .''. $_SERVER['REMOTE_ADDR']);

Проверка входа пользователя в систему для защищенных страниц:

if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] .''. $_SERVER['REMOTE_ADDR'])) {       
        session_destroy();
        header('Location: login.php');
        exit();     
    }

Кажется, это работает нормально, но мои вопросы: насколько это безопасно, это хороший метод или я должен попробовать что-то еще? У поста не было голосов или чего-то такого, поэтому не уверен, что это хорошо.

Кроме того, не знаете, как получить информацию о пользователе в этом сеансе ... нужно ли что-то хранить в базе данных?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 21 августа 2011

Есть две основные проблемы с этим кодом.

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

2) Проверка пользовательского агента очень похожа на переменную get, которая говорит ?is_hacker=false.Если у хакера есть идентификатор сеанса, у него есть пользовательский агент и его тривиальная подмена,Поскольку пользовательский агент является первым, злоумышленник может использовать атаку с префиксом md5 для создания коллизии, и он может обойти проверку REMOTE_ADDR.(Полезная атака коллизий на md5 встречается не слишком часто, но это забавно!)

Даже с этой проверкой CSRF и XSS все еще могут использоваться для влияния на сеанс.XSS можно использовать для чтения токена CSRF, а затем использовать XHR для выполнения любого запроса, который пожелает атакующий.Можно утверждать, что это пытается смягчить OWASP a9 , но на самом деле вам нужно использовать SSL для защиты идентификатора сеанса.

0 голосов
/ 14 января 2013

Я согласен с комментариями Рука, это довольно хороший анализ вашего кода.

Есть много вещей, которые нужно учитывать для защиты сессий PHP, но с обновленной версией PHP это не трудно достичь, некоторые вещи, которые нужноПодумайте о: - Где файлы сеанса хранятся на вашем сервере (в основном это проблема, если это общий сервер) - Использование безопасного соединения для всех конфиденциальных данных и файлов cookie, передаваемых между клиентом и сервером - Делайте все возможное, чтобы создать сеанс файлов cookieID на клиенте защищен - не храните конфиденциальные данные в переменной сеанса

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

Если вам нужно больше узнать о безопасности сеанса PHP, у меня есть серия постов в блоге на эту тему .

0 голосов
/ 21 августа 2011

Это похоже на хороший метод, однако хеш отпечатка пальца генерируется данными клиента, которые могут быть подделаны. Хороший метод для использования в форме входа в систему - это генерирование случайного токена, который сохраняется в сеансе и передается через форму. Как только токен проверен (или нет), он должен быть сброшен только для одноразового использования.

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

...