WEBサービスで訪問者のデータを保持する手法としてSessionやCookieなどが一般的に利用されています。ここではPHPにおけるSessionの使い方や注意点を紹介していきます。
PHPのおけるセッションとは複数回のアクセスを通じて特定のデータを保持する手段を実現するものです。 WEBサイトの訪問者にはセッションIDといわれる単一のIDが割り当てられ、セッションIDをCookieまたはURLに埋め込むことで訪問者のデータを個別に保有することができます。
WEBサイトではあらゆる場面でセッションが使用されています。
PHPでは$_SESSION
というスーパーグローバール変数に現在登録されてるセッションの値が格納されています。中身は連想配列として値が保存されています。
セッションを扱うためにはsession_start
関数を使用してセッションをスタートします。
<?php
session_start();
?>
セッション情報は$_SESSION
に連想配列(キーと値のペア)で保存されます。セッションに値を登録するには以下のように記述します。
$_SESSION['キー'] = 値;
セッションでサイトにアクセスした数をカウントする処理をカウントします。
<?php
session_start();
$count = $_SESSION['count'] ?? 0;
$_SESSION['count'] = $count + 1;
echo $count;
これでサイトにアクセスするとカウントアップされる処理ができました。
session_start
でセッション処理を開始すれば$_SESSION
を連想配列のように使い回すことができるようになります。
キーを指定してセッションを削除する場合はunset
を使用します。
unset($_SESSION['count']);
全てのセッションを削除したい場合は、$_SESSION
に空配列を設定することで削除されます。
$_SESSION = [];
session_destroy
関数を使ってもセッションを全て削除することができますが、セッション変数の利用を再開するには session_start()
をもう一度呼び出す必要があります。
セッションには有効期限がありデフォルトではブラウザを閉じるとデータも破棄されます。
ブラウザを閉じてもセッションを保持し続けるためにはcookie_lifetime
を設定します。
<?php
// セッションの有効期限を30日にする例
session_start([
'cookie_lifetime' => 60 * 60 * 24 * 30,
]);
?>
セッション情報にはログインなどの機密情報が設定されていることが多く、セッションIDを盗まれるとログイン状態をそのまま他人に乗っ取られてしまします(セッションハイジャック)。
実際にセッションを乗っ取るサンプルを紹介します。 ChromeのDeveloperToolを開きApplicationを選択します。
この中にあるPHPSESSID
の値をコピーしておきます。
シークレットモードで先ほどのカウント処理を開くと値が初期化されてますが、同じくDeveloperTookを開きPHPSESSID
の値を先ほどコピーした値に書き換えるとカウントアップの値が変わります。
たったこれだけで、別ユーザーが使っているセッション情報を盗むことができるのです。 対応としては通信の暗号化やアクセス毎にsession_idを変更したりするなど対応はありますが長くなるのでここでは紹介しません、環境に合わせたセキュリティ対応を行うようにしましょう。
PHPでは$_SESSION
を使うことで簡単にセッション処理を実装することができます。会員登録が必要なサイトでは必ず実装するような内容ですので是非覚えておいてください。