22

私はこのトピックがたくさん議論されていることを知っていますが、まだ答えられていないいくつかの特定の質問があります。例えば:

// **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()正しいですか?
4

1 に答える 1

17

あなたの設定は素晴らしいです。あなたは間違いなくphpセッションをロックダウンする方法を読んでいます。ただし、このコード行は、php構成によって提供される多くの保護を無効にします。 session_id(sha1(uniqid(microtime()));

これは、セッションIDを生成するための特にひどい方法です。構成に基づいて/dev/urandom 、素晴らしいエントロピープールであるセッションIDを生成します。これは、すでにほとんどがタイムスタンプであるuniqid()よりもはるかにランダムになります。このミックスに別のタイムスタンプを追加しても、まったく役に立ちません。このコード行をできるだけ早く削除してください。

IPアドレスの確認には問題があり、ユーザーがロードバランサーやTORの背後にいる場合など、正当な理由でIPアドレスが変更されます。ユーザーエージェントのチェックは無意味です。これは、のようなGET変数を持っているようなもの?is_hacker=Falseです。攻撃者がセッションIDを持っている場合は、おそらくユーザーエージェントを持っています。持っていない場合、この値はブルートフォース攻撃に非常に簡単です。

于 2011-12-07T17:38:50.850 に答える