セッション関数
PHP Manual

session_regenerate_id

(PHP 4 >= 4.3.2, PHP 5, PHP 7)

session_regenerate_id 現在のセッションIDを新しく生成したものと置き換える

説明

bool session_regenerate_id ([ bool $delete_old_session = false ] )

session_regenerate_id() は現在のセッションIDを 新しいものと置き換えます。その際、現在のセッション情報は維持されます。

session.use_trans_sid が有効な場合は、 session_regenerate_id() を呼んでから出力を始めないといけません。 それ以前の出力には、古いセッション ID が使われます。

警告

Current session_regenerate_id does not handle unstable network well. e.g. Mobile and WiFi network. Therefore, you may experience lost session by calling session_regenerate_id.

You should not destroy old session data immediately, but should use destroy time-stamp and control access to old session ID. Otherwise, concurrent access to page may result in inconsistent state, or you may have lost session, or it may cause client(browser) side race condition and may create many session ID needlessly. Immediate session data deletion disables session hijack attack detection and prevention also.

パラメータ

delete_old_session

関連付けられた古いセッションを削除するかどうか。 You should not delete old session if you need to avoid races caused by deletion or detect/avoid session hijack attacks.

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

変更履歴

バージョン 説明
7.0.0 session_regenerate_id() saves old session data before closing.
5.1.0 delete_old_session パラメータが追加されました。
4.3.3 これ以降、セッション保持にクッキーを使用している場合、 session_regenerate_id() を使用することにより 新しいセッション ID を持つセッションクッキーも発行します。

例1 A session_regenerate_id() の使用例

<?php
// NOTE: This code is not fully working code, but an example!

session_start();

// Check destroyed time-stamp
if (isset($_SESSION['destroyed'])
    && 
$_SESSION['destroyed'] < time() - 300) {
    
// Should not happen usually. This could be attack or due to unstable network.
    // Remove all authentication status of this users session.
    
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
    throw(new 
DestroyedSessionAccessException);
}

$old_sessionid session_id();

// Set destroyed timestamp
$_SESSION['destroyed'] = time(); // Since PHP 7.0.0 and up, session_regenerate_id() saves old session data

// Simply calling session_regenerate_id() may result in lost session, etc.
// See next example.
session_regenerate_id();

// New session does not need destroyed timestamp
unset($_SESSION['destroyed']);

$new_sessionid session_id();

echo 
"古いセッション: $old_sessionid<br />";
echo 
"新しいセッション: $new_sessionid<br />";

print_r($_SESSION);
?>

Current session module does not handle unstable network well. You should manage session ID to avoid lost session by session_regenerate_id.

例2 Avoiding lost session by session_regenerate_id()

<?php
// NOTE: This code is not fully working code, but an example!
// my_session_start() and my_session_regenerate_id() avoid lost sessions by
// unstable network. In addition, this code may prevent exploiting stolen
// session by attackers.

function my_session_start() {
    
session_start();
    if (isset(
$_SESSION['destroyed'])) {
       if (
$_SESSION['destroyed'] < time()-300) {
           
// Should not happen usually. This could be attack or due to unstable network.
           // Remove all authentication status of this users session.
           
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
           throw(new 
DestroyedSessionAccessException);
       }
       if (isset(
$_SESSION['new_session_id'])) {
           
// Not fully expired yet. Could be lost cookie by unstable network.
           // Try again to set proper session ID cookie.
           // NOTE: Do not try to set session ID again if you would like to remove
           // authentication flag.
           
session_commit();
           
session_id($_SESSION['new_session_id']);
           
// New session ID should exist
           
session_start();
           return;
       }
   }
}

function 
my_session_regenerate_id() {
    
// New session ID is required to set proper session ID
    // when session ID is not set due to unstable network.
    
$new_session_id session_create_id();
    
$_SESSION['new_session_id'] = $new_session_id;
    
    
// Set destroy timestamp
    
$_SESSION['destroyed'] = time();
    
    
// Write and close current session;
    
session_commit();

    
// Start session with new session ID
    
session_id($new_session_id);
    
ini_set('session.use_strict_mode'0);
    
session_start();
    
ini_set('session.use_strict_mode'1);
    
    
// New session does not need them
    
unset($_SESSION['destroyed']);
    unset(
$_SESSION['new_session_id']);
}
?>

参考


セッション関数
PHP Manual