2012-04-04 7 views
5

私はPHPログアウトページを持っています。ユーザーがログアウトリンクをクリックしたときこのページを参照して、インデックスページにリダイレクトします。しかし、戻るボタンをクリックすると、前のページにユーザーデータが表示されます。もちろん私はページをリフレッシュするときに私はpreviouseページとデータを参照してください。私は他のコード(drupal)をクリックした後ログアウトをクリックして戻るボタンをクリックします。私はpreviouseページを見ず、ログインページを見ます。私の問題はどこにあるの?これを修正する方法は?ログアウト後に戻るボタンを防止するページ

ログアウトページ:

if (isset($_GET['req']) && $_GET['req'] == 'logout') { 
     session_start(); 
     session_destroy(); 
     header("Location: index.php"); 
    exit(); 
} 

おかげ

+0

ある場合、あなたはJS – Michal

+3

ザ・でこれを行う必要があります「前の」ページはブラウザのキャッシュに残ります。アクティブなログインを必要とするページへの「バック」操作を防止したい場合は、キャッシュできないようにする必要があります。 –

+0

それらをuncacheableにすることで、ブラウザが履歴にそれらを保存するのを妨げません... imo – Michal

答えて

2

コードが正しいです。実際には、バックボタンをクリックしている人を防ぐ必要はありません。これが重要だと本当に思っているなら、あなたはcookieなどをlogout.phpに保存することができ、メインページはこのCookieが設定されているかどうかをAJAXでチェックします。それがJSならページをリロードすることができます(もちろんCookieの設定を解除することもできます)。しかし、本当に安全な方法は存在しません。

-3

これをコードに追加すると、ユーザーが戻るボタンをクリックできなくなります。

 ignore_user_abort(true); 
+0

いいえ、それはしません... 'ignore_user_abort()'は、クライアントの切断によってスクリプトが中止されるべきかどうかを設定します。 – Michal

1

あなたは、本質的に、彼らはへのアクセスを持っていたページのユーザーのブラウザの履歴やキャッシュを消去、もはや行う方法を求めていません。ユーザーをログアウトすると、ページを再読み込みする機能が削除されます。実行できることがあれば、ブラウザーが一度に読み込めるようにすることができなくなります(それは失効したデータです)。重要な点は、リロードするときに新しいデータが取得されないことです。キャッシュが既にロードされているものを消去することはできません。

編集:はまた、他の人のコメントを読んだ後に何かを追加したい:あなたは彼らが戻ってボタンを押した場合でも、すべてを再ロードするためにそれらを必要とするデータのいずれかをキャッシュしないように、ブラウザを伝えることはできます」また、認証されていてもすべてをリロードする必要があります。これは、あなたが考慮する必要があるトレードオフです。明らかにあなたのサイトにある特定の状況にもよりますが、私はそれが価値のあるトレードオフになるとは思っていません。ブラウザがローカルキャッシュに依存できないため、ページの読み込み時間が長くなるため、アプリケーションが自然にユーザーの方が遅くなるように見えるため、ホスティングにはすべてのページロード時にリソースが再ダウンロードされるため、より多くの帯域幅が必要になります。データが積極的にログインしていない限り、データが表示されないことが絶対的に必要でない限り、ユーザーにログアウトしてブラウザウィンドウを閉じるように丁寧で目立たない方法を見つけるだけで、詮索の可能性を減らすことができます彼らはしてはならないデータを見ている。

0

使用$_SESSION

何もフォームを検証することは、あなたがこの

session_start(); 

if(/** login Condition **/) 
{ 
    $_SESSION ['auth'] = true ; 
} 

if (! isset ($_SESSION ['auth']) || $_SESSION ['auth'] == false) { 
    header ("Location: index.php"); 
    exit(); 
} 

おかげ

のようなものを持っているあなたのメインページで確認してください。この

session_start(); 
if (isset ($_GET ['req']) && $_GET ['req'] == 'logout') { 
    $_SESSION ['auth'] = false ; 
    session_destroy(); 
} 

if (! isset ($_SESSION ['auth']) || $_SESSION ['auth'] == false) { 
    header ("Location: index.php"); 
    exit(); 
} 

をお試しください$_GETを使用したがされていません:)

2

これは主にクライアント側の問題で、ブラウザのキャッシュヘッダーのためだと思います。

修正点は何ですか?私の意見で

あなたは静的コンテンツと非静的コンテンツのキャッシュヘッダーを設定する必要があり、適切に

静的コンテンツ(CSS/JavaScriptの/画像):header("Cache-Control", "no-store, no-cache, must-revalidate");

:PHPページ自体については read this

はこのトリックを行うべきである

0

これは簡単で簡単な解決策です。ログインフォームのタグadd target = "_ blank"には、別のウィンドウにコンテンツが表示されます。その後、ログアウトした後、そのウィンドウを閉じて、戻るボタンの問題(Safariブラウザ)を解決します。履歴を使用しようとしてもページが表示されず、代わりにログインページにリダイレクトされます。これはSafariブラウザでは問題ありませんが、Firefoxのようにsession_destroy();それを処理します。

0
<? 
session_start(); 
if(!isset($_SESSION['username']) && !isset($_SESSION['password'])){ 
header("Location:../index.php"); 
exit; 
} 
else{ 
session_destroy(); 
} 
?> 

すべてのページにこれを貼り付けたり、あなたのログアウトは、あなたがPHPでこれを行うことはできません

<?php 
session_start(); 
session_unset(); 
session_destroy(); 
header("Location:../index.php"); 
exit; 

user_logout.php

関連する問題