Правильное предотвращение перехвата сессии в PHP - PullRequest
21 голосов
/ 07 декабря 2011

Я знаю, что эта тема обсуждалась много , но у меня есть несколько конкретных вопросов, на которые до сих пор нет ответа.Например:

// **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 Ответ

16 голосов
/ 07 декабря 2011

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

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

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

...