Правильное предотвращение перехвата сессии в PHP
Я знаю, что эта тема много обсуждалась, но у меня есть несколько конкретных вопросов, на которые до сих пор нет ответа. Например:
// **PREVENTING SESSION HIJACKING**
// Prevents javascript XSS attacks aimed to steal the session ID
ini_set('session.cookie_httponly', 1);
// Adds entropy into the randomization of the session ID, as PHP's random number
// generator has some known flaws
ini_set('session.entropy_file', '/dev/urandom');
// Uses a strong hash
ini_set('session.hash_function', 'whirlpool');
// **PREVENTING SESSION FIXATION**
// Session ID cannot be passed through URLs
ini_set('session.use_only_cookies', 1);
// Uses a secure connection (HTTPS) if possible
ini_set('session.cookie_secure', 1);
session_start();
// If the user is already logged
if (isset($_SESSION['uid'])) {
// If the IP or the navigator doesn't match with the one stored in the session
// there's probably a session hijacking going on
if ($_SESSION['ip'] !== getIp() || $_SESSION['user_agent_id'] !== getUserAgentId()) {
// Then it destroys the session
session_unset();
session_destroy();
// Creates a new one
session_regenerate_id(true); // Prevent's session fixation
session_id(sha1(uniqid(microtime())); // Sets a random ID for the session
}
} else {
session_regenerate_id(true); // Prevent's session fixation
session_id(sha1(uniqid(microtime())); // Sets a random ID for the session
// Set the default values for the session
setSessionDefaults();
$_SESSION['ip'] = getIp(); // Saves the user's IP
$_SESSION['user_agent_id'] = getUserAgentId(); // Saves the user's navigator
}
Итак, мои вопросы
- сделать
ini_set
Обеспечить достаточную безопасность? - Можно ли сохранить IP-адрес пользователя и навигатор, а затем проверять его каждый раз при загрузке страницы для обнаружения перехвата сеанса? Может ли это быть проблематичным в любом случае?
- это использование
session_regenerate_id()
правильный? - это использование
session_id()
правильный?
1 ответ
Ваша конфигурация потрясающая. Вы определенно прочитали о том, как заблокировать сессии php. Однако эта строка кода отрицает большую часть защиты, обеспечиваемой вашей конфигурацией php:session_id(sha1(uniqid(microtime()));
Это особенно ужасный метод генерации идентификатора сеанса. На основе ваших конфигураций вы генерируете идентификатор сеанса из /dev/urandom
который является удивительным пулом энтропии. Это будет намного более случайным, чем uniqid(), который уже в основном является временной меткой, добавление другой временной метки к этому миксу не поможет вообще. Удалите эту строку кода, как можно скорее.
Проверка IP-адреса проблематична, ip-адреса меняются по законным причинам, например, если пользователь находится за балансировщиком нагрузки или TOR. Проверка пользовательского агента не имеет смысла, это похоже на переменную GET, например ?is_hacker=False
Если у злоумышленника есть идентификатор сеанса, у него, вероятно, есть пользовательский агент, а если у него нет, это значение действительно легко переборить.