uiuifree.com

- サイト制作のノウハウと最適化を目指して-

2020.11.15【PHP】Sessionの使い方と基本知識

【PHP】Sessionの使い方と基本知識

WEBサービスで訪問者のデータを保持する手法としてSessionやCookieなどが一般的に利用されています。ここではPHPにおけるSessionの使い方や注意点を紹介していきます。

Session(セッション)とは

PHPのおけるセッションとは複数回のアクセスを通じて特定のデータを保持する手段を実現するものです。 WEBサイトの訪問者にはセッションIDといわれる単一のIDが割り当てられ、セッションIDをCookieまたはURLに埋め込むことで訪問者のデータを個別に保有することができます。

Sessionの実用例

WEBサイトではあらゆる場面でセッションが使用されています。

  • 会員登録してサイトにログインしたとき
  • ECサイトで商品をカートに入れたとき
  • サイトに流入して行動履歴を保存するとき

$_SESSION(セッション)の使い方

PHPでは$_SESSIONというスーパーグローバール変数に現在登録されてるセッションの値が格納されています。中身は連想配列として値が保存されています。

$_SESSION(セッション)の開始宣言

セッションを扱うためにはsession_start関数を使用してセッションをスタートします。

<?php
session_start();
?>

$_SESSION(セッション)の保存方法

セッション情報は$_SESSIONに連想配列(キーと値のペア)で保存されます。セッションに値を登録するには以下のように記述します。

$_SESSION['キー'] = 値;

セッションでサイトにアクセスした数をカウントする処理をカウントします。

<?php
session_start();
$count = $_SESSION['count'] ?? 0;
$_SESSION['count'] = $count + 1;

echo $count;

これでサイトにアクセスするとカウントアップされる処理ができました。 session_startでセッション処理を開始すれば$_SESSIONを連想配列のように使い回すことができるようになります。

$_SESSION(セッション)の削除方法

キーを指定してセッションを削除する場合はunsetを使用します。

unset($_SESSION['count']);

全てのセッションを削除したい場合は、$_SESSIONに空配列を設定することで削除されます。

$_SESSION = [];

session_destroy関数を使ってもセッションを全て削除することができますが、セッション変数の利用を再開するには session_start() をもう一度呼び出す必要があります。

$_SESSION(セッション)の有効期限

セッションには有効期限がありデフォルトではブラウザを閉じるとデータも破棄されます。 ブラウザを閉じてもセッションを保持し続けるためにはcookie_lifetimeを設定します。

<?php
// セッションの有効期限を30日にする例
session_start([
    'cookie_lifetime' => 60 * 60 * 24 * 30,
]);
?>

Sessionのセキュリティについて

セッション情報にはログインなどの機密情報が設定されていることが多く、セッションIDを盗まれるとログイン状態をそのまま他人に乗っ取られてしまします(セッションハイジャック)。

Sessionを乗っ取ってみよう

実際にセッションを乗っ取るサンプルを紹介します。 ChromeのDeveloperToolを開きApplicationを選択します。

php-session-id.png

この中にあるPHPSESSIDの値をコピーしておきます。

シークレットモードで先ほどのカウント処理を開くと値が初期化されてますが、同じくDeveloperTookを開きPHPSESSIDの値を先ほどコピーした値に書き換えるとカウントアップの値が変わります。

たったこれだけで、別ユーザーが使っているセッション情報を盗むことができるのです。 対応としては通信の暗号化やアクセス毎にsession_idを変更したりするなど対応はありますが長くなるのでここでは紹介しません、環境に合わせたセキュリティ対応を行うようにしましょう。

まとめ

PHPでは$_SESSIONを使うことで簡単にセッション処理を実装することができます。会員登録が必要なサイトでは必ず実装するような内容ですので是非覚えておいてください。

目次
PROFILE

このサイトを運営してるuiuifreeです。
渋谷のベンチャー企業で2年ほど新規事業を担当した後にフリーランスエンジニアにキャリア転換。
求人サイトの開発が多くエンジニア/看護師/保育士などの分野でサイトを運営しています。

アウトプット中の技術

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)