ユーザーはセッション データや Cookie をリセットした後は何も変更できませんが、ログインしているユーザーが最後にアクセスしたときに表示された通常の情報が引き続き表示される場合があることに注意してください。これは、ブラウザがページをキャッシュしていることが原因です。
ログインしたユーザーがアクセスできるすべてのページに必ずヘッダーを追加して、データが機密であり、戻るボタンのスクリプト結果をキャッシュしてはならないことをブラウザーに伝える必要があります。追加することが重要です
header("Cache-Control: no-cache, must-revalidate");
このヘッダーの下のスクリプトの直接の結果以外の他の要素は引き続きキャッシュされ、それを利用できることに注意してください。ページの一部を徐々に読み込み、機密データとメインの HTML にこのヘッダーをタグ付けすることを確認してください。
答えが示唆するように、グローバル変数のlogged_in
一部を設定解除$_SESSION
するとログアウトできますが、最初に、PHP のsession_destroy()
ドキュメントに記載されているようにセッションを破棄する必要がないことに注意してください。
注: 通常のコードから session_destroy() を呼び出す必要はありません。セッション データを破棄するのではなく、$_SESSION 配列をクリーンアップします。
次に、ドキュメントの次の警告で説明されているように、セッションをまったく破棄しない方がよいでしょう。
また、unset()
遅延関数です。問題の変数 (の一部) が次に使用されるまで、効果が適用されないことを意味します。同時リクエストで使用される可能性のある大部分がグローバル変数である、機密性の高いケースでは、即時の効果のために代入を使用することをお勧めします。代わりにこれを使用することをお勧めします:
$_SESSION['logged_in'] = null;
ガベージコレクターにそれを収集させますが、同時にログインユーザーとしては有効ではありません。
最後に、ソリューションを完成させるために、いくつかの関数を次に示します。
<?php
/*
* Check the authenticity of the user
*/
function check_auth()
{
if (empty($_SESSION['logged_in']))
{
header('Location: login.php');
// Immediately exit and send response to the client and do not go furthur in whatever script it is part of.
exit();
}
}
/*
* Logging the user out
*/
function logout()
{
$_SESSION['logged_in'] = null;
// empty($null_variable) is true but isset($null_variable) is also true so using unset too as a safeguard for further codes
unset($_SESSION['logged_in']);
// Note that the script continues running since it may be a part of an ajax request and the rest handled in the client side.
}