Правильное предотвращение захвата сеанса в 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() ?

Ваша конфигурация потрясающая. Вы определенно прочитали, как заблокировать сеансы php. Однако эта строка кода отрицает много защиты, предоставляемой вашей конфигурацией php: session_id(sha1(uniqid(microtime()));

Это особенно ужасный способ генерации идентификатора сеанса. На основе ваших конфигураций вы генерируете идентификатор сеанса из /dev/urandom который является удивительным энтропийным пулом. Это будет намного более случайным, чем uniqid (), который уже в основном является меткой времени, добавив еще одну метку времени в этот микс, совсем не помогает. Удалите эту строку кода, как можно скорее.

Проверка IP-адреса проблематична, IP-адреса меняются по законным причинам, например, если пользователь находится за балансировщиком нагрузки или TOR. Проверка агента пользователя бессмысленна, она похожа на переменную GET, например ?is_hacker=False , если у злоумышленника есть идентификатор сеанса, у которого, вероятно, есть пользовательский агент, и если это не так, то это очень просто для грубой силы.