私はウェブサイト上のユーザーのセッションを保護しようとしています。 ログインフローでは、セッション固定の観点からより良いセキュリティ(推測の機会を減らす)を確保するために、セッションIDを再生成しています。私はsession_regenerate_id()の作業のためのスクリプトをテストしようとしていました。 2つのインスタンスがあります。彼らは以下のとおりです。session_regenerate_id()は内部でどのように動作しますか?
/var/www/public/goto/index.php:31:int 0
/var/www/public/goto/index.php:32:string 'q96btv7i1ukpb3cq8tskcgdeb7' (length=26)
別のタブ(同じブラウザ)の場合:
1)
<?php
session_start();
if (!isset($_SESSION['times'])) {
$_SESSION['times'] = 0;
$_SESSION['generate'] = true;
} else {
if ($_SESSION['generate'] === true) {
session_regenerate_id(true);
$_SESSION['generate'] = false;
}
$_SESSION['times']++;
}
var_dump($_SESSION['times']);
var_dump(session_id());
?>
には、次の私はそれを持って出力されます)(真session_regenerate_idを使用して、古いセッションを削除します。
/var/www/public/goto/index.php:31:int 1 /var/www/public/goto/index.php:32:string 'gspq91o1jbcrcc27b4fkm4qgd5' (length=26)
別のタブで同じページを開いた後にフォルダをチェックすると、 session_regenerate_id()最初のタブのための
<?php
session_start();
if (!isset($_SESSION['times'])) {
$_SESSION['times'] = 0;
$_SESSION['generate'] = true;
} else {
if ($_SESSION['generate'] === true) {
session_regenerate_id();
$_SESSION['generate'] = false;
}
$_SESSION['times']++;
}
var_dump($_SESSION['times']);
var_dump(session_id());
?>
出力を使用することによりgspq91o1jbcrcc27b4fkm4qgd5
2)だけで再生された新しいセッションID:ESは私だけの文字列に関連付けられたセッションファイルを見つけ、保存されている
2番目のタブで/var/www/public/goto/index.php:31:int 0
/var/www/public/goto/index.php:32:string 'odu7sttll7pp43suqu22laa755' (length=26)
出力:
この場合、0が、私は両方のセッションIDのセッションファイルを見つけました:odu7sttll7pp43suqu22laa755と27po8j6bu318fd3e69ug4m53i3 このように、機能が言う、それはありません。 しかし、最初のケースでは、session_regenerate_id(true)
を使用すると、最初のタブのCookieに古いセッションIDが含まれていましたが、新しいタブのCookieには新しいセッションIDが含まれていました。 2番目のタブを開いた後、最初のタブをリフレッシュすると、私は魔法のように3
を出力し、2番目のタブはsession id
になります。 私がここで理解していないのは、Tab 1
をリフレッシュするときです。サーバーに送信するクッキーには、古いセッションIDが含まれています。有効ではない(サーバー上のファイルとして存在しない)3
を出力するにはどうすればよいですか?
タブ1に再生と新しいセッションCookieがない場合でも、同じセッションはどのように保持されますか?
タブ1のページを更新するときに要求しないでください私に新しく生成されたセッションを取得します(タブ2)。
これは、同じブラウザで2つのセッションを持つことになりますが、これは実際には起こりません。 PHPはsession_regenerate_id(true)
でこれをどのように処理しますのでご注意ください:次はするphpinfoからのセッションのための私の出力()
ブラウザはCookieを処理し、サーバーが新しいセッションIDを生成すると、サーバーは新しいCookieを戻します。ブラウザはCookieを受け入れます(ブラウザの設定によって異なります)。新しい要求を行うとブラウザ新しいクッキーを送り返します。 –
また、キャッシュを使用している場合、ブラウザは新しいCookieではなくキャッシュ内のCookieを使用できます。セッションを再生成するときは、 'CTRL + R 'を押してキャッシュなしでリフレッシュしてみてください。 – AnthonyB
@AnthonyB興味深い点。私はキャッシュからクッキーを使用しているブラウザに遭遇したことはありませんでしたが、私はこれを掘り下げます。 –