2009-11-05 28 views
5

PHPアプリケーションの認証メカニズムを作成しようとしていますが、セッションを破壊するのが難しいです。私は、以前のセッションの配列内に設定された認証トークンを設定解除して、PHPセッションがユーザーログアウト後に破棄されない

session_destroyを通じて

をセッションを破壊するだけでなく、セッションを破棄する前に完全にセッションの配列をリセットしようとしました。ヘッダー関数を呼び出して、関数呼び出しの最後にindex.phpページに戻ります。私はまた、セッションのクローズ処理するために

session_write_close

を試してみました。私がユーザーをログアウトすると、セッションのVardumpが実行され、データは存在しませんが、index.phpページに戻ると、ユーザー認証データが返されます。私はポスト・データのバーディンプルもやっていました。ポスト認証ハンドラを何とか再送信しないようにしています。

ここで何をすべきですか?

+0

通常、ユーザー認証のためにsession_write_close()を使用する必要はありません。 – mauris

答えて

6

まずブラウザのキャッシュをクリアすることを忘れないでください。に電話する前にsession_destroy();に電話をかけてください。 PHP: session_destroyからも

、:

、完全にセッションを殺すユーザをログアウトするようにするために、セッションIDも設定を解除する必要があります。 Cookieを使用してセッションIDを伝播する場合(デフォルトの動作)、セッションCookieを削除する必要があります。それにはsetcookie()を使用することができます。
+4

logout.phpページでsession_startを呼び出していない場合の+1。 – jkushner

+0

名前付きセッションを使用した場合は、session_nameも使用することを忘れないでください! – Calmarius

0

私はバイオリンを使用してサーバにブラウザを送信しているものをチェックしても、あなたのsession.save_pathはで

0

を格納していないどのような情報をチェックだろうあなたはページがキャッシュされていませんか?認証トークンを超える

書き込み:しかし

session_start(); 
$_SESSION['varName'] = null; 
$_SESSION = array(); 
session_destroy(); 
0

私はindex.phpページ

に戻るだけで、ブラウザから要求されて、特定のページではありませんキャッシュ?ページのハードリフレッシュを実行します(ほとんどのウェブブラウザーでCTRL+F5)。

ことが原因であることが判明し、要求のキャッシュを無効にする、HTML <head>にあなたのページをヘッダの次のセットを追加する場合:

<meta http-equiv="cache-control" content="no-cache,no-store,must-revalidate"> 
<meta http-equiv="pragma" content="no-cache"> 
<meta http-equiv="expires" content="0"> 

や、PHPのheader()機能を使用してPHPのコードで:

header('cache-control: no-cache,no-store,must-revalidate'); // HTTP 1.1. 
header('pragma: no-cache'); // HTTP 1.0. 
header('expires: 0'); // Proxies. 

あなたはを呼び出していることを確認し、:)テストする前に

2

PHPセッションについても注目に値する、session_unset()>​​; 私は理由を知らない。PHP Manual entry on session_destroy()を読んだ後は、現在のコンテキスト内のデータだけを削除し、実際にはフラットセッションファイルからデータを消去しないように見えるので、クッキーをクリアしなかった場合はすぐに戻すことができます。これは非常に直感的で(PHPが頻繁にそうであるように)、おそらくsession_unset()を​​以上に使用することを決めた(そして、理由をすぐに忘れてしまった)理由かもしれません。

また、PHPがすべての開発者が期待する方法で動作するので、このセッションナンセンスをすべて実行した後にリダイレクトが発生していることを確認してください。ベストプラクティス、IMOは、die;

1

と一緒にすべてのheader('Location: ...');コールに従うことです。session_unset()だけを使用すると、buggy IEはデータを保持しますが、私の提案は両方を使用することです。

関連する問題