5

CodeIgniter でセッション ID を更新する必要があるのはなぜですか。構成でセッション ID が更新される頻度を制御できることは知っています。しかし、なぜ彼らはセッションの id を 5 分ごとに (デフォルトで) 変更するのでしょうか?

一度セッションを作成できず、セッションの有効期限が切れるまで同じ ID を使用できないのはなぜですか?

セッションを更新する関数は次のとおりです。

/**
 * Update an existing session
 *
 * @access  public
 * @return  void
 */
function sess_update()
{
    // We only update the session every five minutes by default
    if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
    {
        return;
    }

    // Save the old session id so we know which record to
    // update in the database if we need it
    $old_sessid = $this->userdata['session_id'];
    $new_sessid = '';
    while (strlen($new_sessid) < 32)
    {
        $new_sessid .= mt_rand(0, mt_getrandmax());
    }

    // To make the session ID even more secure we'll combine it with the user's IP
    $new_sessid .= $this->CI->input->ip_address();

    // Turn it into a hash
    $new_sessid = md5(uniqid($new_sessid, TRUE));

    // Update the session data in the session data array
    $this->userdata['session_id'] = $new_sessid;
    $this->userdata['last_activity'] = $this->now;

    // _set_cookie() will handle this for us if we aren't using database sessions
    // by pushing all userdata to the cookie.
    $cookie_data = NULL;

    // Update the session ID and last_activity field in the DB if needed
    if ($this->sess_use_database === TRUE)
    {
        // set cookie explicitly to only have our session data
        $cookie_data = array();
        foreach (array('session_id','ip_address','user_agent','last_activity') as $val)
        {
            $cookie_data[$val] = $this->userdata[$val];
        }

        $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));
    }

    // Write the cookie
    $this->_set_cookie($cookie_data);
}
4

2 に答える 2

4

これは、なりすましを防ぐためのセキュリティ上の理由によるものです。セッションは暗号化され、Cookie に保存されます。誰でもあなたの Cookie をコピーして別の PC に移動し、ログインすることができます。

セッションが期限切れにならないとしましょう。これは、私があなたの PC にアクセスして Cookie を盗んだ場合、Cookie でセッション ID が暗号化されているため、どこからでもログインできることを意味します。フレームワークが 5 分ごとにセッションを更新する場合、これが発生することはほとんどありません。

この動作が気に入らない場合は、Codeigniter のコア システムから拡張することで、いつでも独自のセッション用ライブラリを作成できます。これは提案されていませんが。

于 2012-10-08T21:54:15.637 に答える
1

これはセキュリティ機能です。

グーグル

セッション ハイジャック セッション固定

たとえば、ユーザーがシステムにログインするときに、少なくともセッション ID を変更する必要があります。

ログインして新しいセッションを作成するユーザーには、session_regenerate_id 関数を使用して新しいセッション ID を割り当てる必要があります。乗っ取ったユーザーは、ログインする前にセッション ID を設定しようとします。ログイン時に ID を再生成すると、これを防ぐことができます。

ここでセッションセキュリティの詳細を読むことができます:

PHP セキュリティのベスト プラクティス How
-to-create-bulletproof-sessions

于 2012-10-08T21:54:07.943 に答える