2016-12-18 20 views
1

私はウェブサイト上のユーザーのセッションを保護しようとしています。 ログインフローでは、セッション固定の観点からより良いセキュリティ(推測の機会を減らす)を確保するために、セッション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のセッションファイルを見つけました:odu7sttll7pp43suqu22laa75527po8j6bu318fd3e69ug4m53i3 このように、機能が言う、それはありません。 しかし、最初のケースでは、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からのセッションのための私の出力()php config

+1

ブラウザはCookieを処理し、サーバーが新しいセッションIDを生成すると、サーバーは新しいCookieを戻します。ブラウザはCookieを受け入れます(ブラウザの設定によって異なります)。新しい要求を行うとブラウザ新しいクッキーを送り返します。 –

+1

また、キャッシュを使用している場合、ブラウザは新しいCookieではなくキャッシュ内のCookieを使用できます。セッションを再生成するときは、 'CTRL + R 'を押してキャッシュなしでリフレッシュしてみてください。 – AnthonyB

+0

@AnthonyB興味深い点。私はキャッシュからクッキーを使用しているブラウザに遭遇したことはありませんでしたが、私はこれを掘り下げます。 –

答えて

0

が私を助けてあなたに@Charlotte Dunoisと@AnthonyBに感謝です。
私の間違いでした。
Chrome Dev Toolsでは、Cookie情報をリアルタイムで更新していないようです。設定のすべてのサイトのデータを確認した後、私のドメインに関連付けられているクッキーは1つだけでした。それはタブ2のものでした。
実際には、タブ1を更新すると新しいクッキーが送信されます。例外として@AnthonyBは言った(コメント)。

Dev Toolsでは、タブ1を閉じてタブ1を開いたときに、Cookieタブが更新された値を持つことがわかりました。私はもはや古いクッキー値を見ることができませんでした。

見つけたChromeは、Cookie情報が変更されても(ページ要素、スタイルと同じように)、Cookieのライブ更新を行いません。
私はそれも必要ではないと思います。
すべての人に感謝します。

関連する問題