Я знаю, что эта тема обсуждалась много , но у меня есть несколько конкретных вопросов, на которые еще не ответил. Например:
// **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
достаточную безопасность? session_regenerate_id()
? session_id()
? Ваша конфигурация потрясающая. Вы определенно прочитали, как заблокировать сеансы php. Однако эта строка кода отрицает много защиты, предоставляемой вашей конфигурацией php: session_id(sha1(uniqid(microtime()));
Это особенно ужасный способ генерации идентификатора сеанса. На основе ваших конфигураций вы генерируете идентификатор сеанса из /dev/urandom
который является удивительным энтропийным пулом. Это будет намного более случайным, чем uniqid (), который уже в основном является меткой времени, добавив еще одну метку времени в этот микс, совсем не помогает. Удалите эту строку кода, как можно скорее.
Проверка IP-адреса проблематична, IP-адреса меняются по законным причинам, например, если пользователь находится за балансировщиком нагрузки или TOR. Проверка агента пользователя бессмысленна, она похожа на переменную GET, например ?is_hacker=False
, если у злоумышленника есть идентификатор сеанса, у которого, вероятно, есть пользовательский агент, и если это не так, то это очень просто для грубой силы.