18

Web アプリのログアウト機能をトラブルシューティングしようとしています。ログインすると、アプリのドメインにいくつかの Cookie が設定されます。現在のログアウト手順は次のとおりです。

  • リンクをクリックすると、ログアウト ページが表示されます
  • ログアウト ページはsession_destroy()、ドメインのすべての Cookie を呼び出してループし、過去に期限切れになるように設定する関数を実行します (以下のコードを参照)。
  • ログアウト ページは、そのままの HTML であるログイン ページにリダイレクトされます。

このプロセスの最後に、他のすべての Cookie は設定解除されますが、PHPSESSIDCookie はまだ存在し、同じ値を持ち、セッションの終了時に期限切れになるように設定されたままです。

ここで何が欠けていますか?

上記のログアウト機能は次のとおりです。

function log_out_current_user() {

        // Destroy the session
        if (isset($_SESSION)) {
            session_destroy();
        }

        // Expire all of the user's cookies for this domain:
        // give them a blank value and set them to expire
        // in the past
        if (isset($_SERVER['HTTP_COOKIE'])) {
            $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
            foreach($cookies as $cookie) {
                $parts = explode('=', $cookie);
                $name = trim($parts[0]);
                setcookie($name, '', time()-1000);
                setcookie($name, '', time()-1000, '/');
            }
            // Explicitly unset this cookie - shouldn't be redundant,
            // but it doesn't hurt to try
            setcookie('PHPSESSID', '', time()-1000);
        }

    }
4

1 に答える 1

41

作成されたときと同じパラメーターで削除していません。session_get_cookie_paramsそれらを取得するために使用します。移植可能にするには、 を介して Cookie の名前を取得する必要がありますsession_name。これを行うための小さなスクリプトを次に示します。

$params = session_get_cookie_params();
setcookie(session_name(), '', 0, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));
于 2010-10-21T16:02:03.043 に答える