18

ユーザーがログアウト後に戻るボタンをクリックして保護されたページに戻らないようにします。私のログアウトコードでは、セッションの設定を解除してログインページにリダイレクトしています.しかし、ブラウザがページをキャッシュしているため、セッションがログアウトから破棄されても表示されると思います.

ブラウザのキャッシュを許可しないことでこれを回避できます

header("Cache-Control", "no-cache, no-store, must-revalidate")

しかし、この方法では、ブラウザ キャッシングの利点が失われます。

これを達成するためのより良い方法を提案してください。JavaScriptクライアント側でこれを処理する方法が必要だと思います

4

9 に答える 9

13

これを JavaScript ではなく PHP で実装します。

各ページの上部で、ユーザーがログインしているかどうかを確認します。ログインしていない場合は、ログイン ページにリダイレクトする必要があります。

<?php 
      if(!isset($_SESSION['logged_in'])) : 
      header("Location: login.php");  
?>

あなたが述べたように、ログアウト時に、logged_in セッション変数の設定を解除し、セッションを破棄します。

<?php
      unset($_SESSION['logged_in']);  
      session_destroy();  
?>

ユーザーがここでクリックして戻ると、logged_in セッション変数は使用できず、ページは読み込まれません。

于 2012-05-09T09:04:56.023 に答える
6

私はこの同じ問題に直面していて、それを理解するのに一日を費やしました.最終的に次のように修正しました:

ログイン検証スクリプトで、ユーザーが認証されている場合、たとえば次のように 1 つのセッション値を設定します。

$_SESSION['status']="Active";

次に、ユーザー プロファイル スクリプトに次のコード スニペットを挿入します。

<?php

session_start();

if($_SESSION['status']!="Active")
{
    header("location:login.php");
}

?>

上記のコードが行うことは、$_SESSION['status']が に設定されている場合"Active"にのみ、 user profile にのみ移動し、このセッション キーは"Active"、ユーザーが認証された場合にのみ に設定されます... [否定に注意してください [' ! '] 上記のコード スニペット]

おそらくログアウトコードは次のようになります。

{
    session_start();
    session_destroy();
    $_SESSION = array();
    header("location:login.php");
}

お役に立てれば...!!!

于 2015-03-03T11:23:49.553 に答える
1

サーバー側の唯一のオプションは、キャッシュを許可しないことだと思います。メインの HTML は一連の JS 呼び出しのみであり、ビューはオンザフライで生成されるため、Javascript を多用するアプリケーションを使用している場合、これは実際にはそれほど悪くはありません。そうすれば、大量のデータ (JS MVC とコア コード) はキャッシュされますが、実際のページ リクエストはキャッシュされません。

以下に貼り付けたコメントに追加するには、ロード時に小さな AJAX 呼び出しを追加することをお勧めします。これは、バックエンドに移動してセッションをチェックするキャッシュされたページに対しても発生します。セッションが見つからない場合、ユーザーはリダイレクトされます。これはクライアント側のコードであり、安全な修正ではありませんが、見栄えが良くなります。

これを良心から取り除くことができます

他のすべてが失敗した場合の安価な修正は、ログアウトしたページに「セキュリティ上の理由からこのウィンドウを閉じてください」というメッセージです。— izb 12 年 5 月 9 日 08:36

しかし、NBが言ったように

何も無効にする必要はありません。戻ると、制限されたページのキャッシュされたバージョンが提供されます。その周りをクリックしようとしても、適切なセッションが設定されないため、何も機能しません。— NB

于 2013-01-28T07:54:46.057 に答える
0

適切なセッション変数が設定されているかどうかを確認しながら、制限された各ページに条件/関数を挿入できます。このようにして、ページの2つのバージョンを印刷できます(1つは有効なユーザー用で、もう1つはログインページにリダイレクトします)。

于 2012-05-09T08:32:38.217 に答える
0

ユーザーはセッション データや 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.
}
于 2016-09-22T20:37:07.020 に答える
0

ログインが必要なページ、setInterval1000ミリ秒ごとに使用し、ユーザーがログインしているか、ajaxを使用していないかを確認します。ユーザー セッションが無効な場合は、ログイン ページにリダイレクトします。

于 2014-09-13T06:24:17.673 に答える
0

これが簡単で迅速な解決策です。

target="_blank"別のウィンドウにコンテンツを表示するログイン フォーム タグを追加します。次に、ログアウトした後、そのウィンドウを閉じるだけで、戻るボタンの問題 (Safari ブラウザー) が解決されます。

履歴を使用しようとしても、ページが表示されず、代わりにログイン ページにリダイレクトされます。これは Safari ブラウザでは問題ありませんが、Firefox などの他のブラウザでは問題ありませsession_destroy();ん。

于 2013-07-03T15:30:53.597 に答える
0

ユーザーが戻らないようにすることは正当な理由ではなく、何よりも安全ではありません。

Web サイトで「管理者」アクションを実行する前にユーザーのセッションをテストすれば、ユーザーが戻るボタンを押して、キャッシュされたページを表示し、何かを試しても問題ありません。

セッションが無効になっているため、"ties something" はエラーを返します。

代わりに、本当に安全なバックオフィスを持つことに集中する必要があります。

于 2012-05-09T08:38:13.440 に答える