最初に結論のスクリプト
※あくまでも個人用覚書。環境によっては条件やパラメータ等を追加したほうがよい(解説参照)。
<?php
session_start();
$_SESSION = [];
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time() - 86400, '/');
}
session_destroy();
以下解説
ちゃんとググればPHPのセッションを廃棄する方法は出てくるけど、不正確なものや明らかに間違ってるものから正しいものを抜き出すのも面倒なので覚書として残しておくことにする。
根本的にセッション破棄に関するPHPのオンラインマニュアルの記述がわかりにくい(そもそもsession_destroy()
の項にあるのが間違いを増長している気も…)。
session_start();
セッション利用の合言葉。
php.ini
でsession.auto_start
がonになってなければ必要(デフォルトはoff)。
$_SESSION = [];
セッション情報をすべて廃棄するために行う。$_SESSION = array();
でも同じ。個別のセッションデータを削除したい場合はunset($_SESSION['hoge']);
を使う。
unset($_SESSION);
はやっちゃダメ!! というのは理由も含めてPHPマニュアルに書いてあるが、その場所がsession_unset();
の項だったりするから余計に混乱する。また
session_unset() 関数は、$_SESSION = array()と同等です。
とも書かれてあるが、セッションがアクティブでないと動作しない(セッション情報をクリアしてくれない)ので$_SESSION = []
のほうが確実。
PHPマニュアルにある続きがこれ。
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
セッション管理にCookieを使用している場合はブラウザ側のCookieを削除しておかないとセッションIDが残ってしまい、セキュリティ上よろしくない。
1行目のif
が「セッションでCookieを使用している場合」の判定だが、一般的にセキュリティ上の理由でsession.use_cookies
とsession.use_only_cookies
は絶対にonにしろ!と言われてその通りにしてるので、この条件分岐は個人的には不要。
2行目のsession_get_cookie_params()
でセッション管理用Cookieのパラメーター(連想配列のキーと値)を取得しているが、設定値がわかっていれば下の引数に直接入れてもよい。
3行目のsetcookie
でCookieの削除処理をする。
- 引数1: session_name()はデフォルトだとPHPSSIDとなっているセッション名を取得
これも「セキュリティのため変更することが望ましい」とか書いてあったりする。これもわかっていれば値を直接書いてよい - 引数2: Cookieにセットする文字列だが、今回はどうせ廃棄するのでなんでもよい
- 引数3: Cookieの有効期限だが、現在時間
time()
より前に設定することでCookieが破棄されるようにする。-42000は負の数ならいくつでもよい1 - 引数4: Cookieを有効にしているパス。
'/'
を指定しておくことでサブドメインの壁を超えてドメイン全部に適用される。初期値は空文字列(発行したドメインのみ有効)。自分はサブドメインを超えて使うことがあるかもしれないので指定しておく - 引数5: Cookieを有効にしているドメイン。4と5の2つについてはセキュリティ上「ドメインは設定しないほうが安全」「パスは設定してもセキュリティ上意味がない」とここに書いてあった。初期値は空文字列
- 引数6: CookieをSSLの場合のみ送信する設定。HTTPとHTTPSでセッションを共有してたりしないなら省略可(初期値は
false
)。ここは変更してないので省略 - 引数7: HTTP Only、つまりHTTP(S)以外のスクリプト等からCookieを読ませてよいかどうかのフラグ。デフォルトは
false
でこれも特に変更していないので不要
というわけで、自分が実際に使う際は
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time() - 86400, '/');
}
だけになる。そして最後が
session_destroy();
セッションIDそのものをナシにする。
以上。
ここの説明がわかりやすかった。
-
なぜ
-42000
なのだろう?-86400
辺りのほうが馴染み深いのに。 ↩