web-dev-qa-db-ja.com

(PHP)セッションCookieを正しく破棄する方法は?

管理ユーザーから正しくログアウトしようとしています。これが私の機能です:

function logout()
{
    $_SESSION = array(); //destroy all of the session variables
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }
    session_destroy();
}

基本的に、パスワードを認証したら、セッションを有効に設定します(合計1ユーザーのみ)。ここで、管理者がログアウトした場合は、現在のセッションを破棄し、Cookieも破棄して、ブラウザーに保存されているセッションCookieを使用して管理ページに戻ることができないようにします。しかし、私のコードは動作しません。ログアウトをクリックすると、管理ページに直接戻ることができます。ただし、Cookieを削除すると、機能は完全です。では、ここでのCookie削除機能の何が問題になっていますか?

17
Tony Stark

多分あなたの問題はクッキーではなく、あなたの管理ページのキャッシュされたバージョンを表示しているブラウザです。あれ?打ったときに消えてしまったら F5、それはおそらくそれです。これは、正しいcache-controlヘッダーを設定することでソートできます。

キャッシュの設定方法の問題について this SO question を確認してください。質問(ブラウザにキャッシュを強制する)正反対の方法ですが、キャッシュをオフにするには何を変更すればよいかがわかります。

7
Pekka

あなたが本当にすべての拠点をカバーしたいのなら、やってみてください:

setcookie (session_id(), "", time() - 3600);
session_destroy();
session_write_close();

これにより、残りのPHP実行中はセッションデータにアクセスできなくなります。ブラウザはCookieが設定されていることを表示する場合がありますが、$ _ SESSIONスーパーは空白になります

9
MANCHUCK

セッションCookieの期限切れに問題がある他の人のためのヒント:

PHP-なぜこのセッションID Cookieを削除できないのですか?

上記のリンクの質問への回答のように、常にsession_get_cookie_params()を使用してください。

4
bearfriend