セッション(session)をPHPで使うための基本知識を解説!
セッションはPHPだけで使われるものではありません。他の言語を扱うにしても、特にWebアプリなどを制作する上で仕組みをよく理解しておく必要があります。
ここでは、PHPでセッション(session)を使う場合の基本的な記述方法や、セキュリティについても簡単に紹介していきます。
PHPを学ぶなら知っておきたいセッション(session)の知識
セッションとは、サーバー側にデータを保存する仕組みのことです。Webサービスを構築する上でユーザーごとのページを表示させるためなどに応用できます。
例えばショッピングサイトではログインをしてマイページへ行き、そして購入したい商品情報をショッピングカートに入れるなどの遷移や機能があります。こうした情報のやり取りではセッションが利用されています。
クッキー(cookie)との違い
クッキーもセッションと同じくデータを保存する仕組みを指して呼ぶため、セッションと混同されることがあります。しかしセッションはサーバーにデータを保存するのに対し、クッキーはブラウザ側に保存するという違いがあります。
ブラウザに保存されているデータはユーザー側で内容を書き換えることもできるため、その情報を信頼してやり取りをするのは好ましくありません。ログインすると個人情報が見えるような場合、そのログイン情報はセキュリティ面で優れているセッションで扱うことになります。
データをセッションに格納する場合はまずサーバー側でファイルが作成されます。そのためには他の誰かと同じになりにくいハッシュ値と呼ばれる数値を渡し、そしてサーバー側ではその数値名と紐づけたファイルを作成することになります。
セッションの基本的な使い方
セッションでデータをクライアント側に保存するほうがセキュリティメンでの安全性が高いですが、実際にセッションを利用する場面では同時にクッキーも使用されています。サーバー側で作られたファイルは数値で識別されます。これをセッションIDと呼び、この情報はクッキーで保存されているのです。
この数値がどのように発行され、セッションにデータを格納するためにはどのようにすればいいのか以下で説明していきます。
セッション管理の開始
セッションでデータを扱うためには、まずセッションの管理を開始するよう指示を出します。
<?php
session_start();
?>
そしてセッションがすでに開始されていなかった場合にはセッションIDが割り当てられ、クッキーからその値にアクセスできるようになります。クッキー名は「PHPSESSID」なので、セッションが開始されている状態で以下のように記述しておくとその値を見ることができます。
<?php
print('セッションIDは '.$_COOKIE['PHPSESSID'].' 。');
?>
セッション変数の書き込みと削除
サーバーに値を保存するにはセッション変数を定義します。そしてそのためには「$_SESSION」という変数を使います。以下のような形です。
$_SESSION['username'] = 'tanaka';
[]の中にセッション変数名、そして代入演算子でその変数名に対応した値を入力します。
そしてこれを表示させる場合には以下のように記述します。
<?php
print('ユーザー名は '. $_SESSION['username'].' 。');
?>
そして、保存したセッション変数を削除するにはunset()関数を使用します。
セッションIDの表示からセッション変数の定義、セッション変数の削除までをまとめると以下のように記述できます。
<?php
session_start();
print('セッションIDは '.$_COOKIE['PHPSESSID'].' です。');
$_SESSION['username'] = 'tanaka';
echo 'ユーザー名は '. $_SESSION['username'].' 。';
unset($_SESSION['username']);
if (!isset($_SESSION['username'])){
echo 'ユーザー名は削除されました。';
}else{
echo 'ユーザー名は '. $_SESSION['username'].' 。';
}
?>
これを実行すると、
「セッションIDは〇〇(ハッシュ値)です。ユーザー名はtanaka。ユーザー名は削除されました。」
とブラウザに表示されます。
セッションで注意したいセキュリティ上の問題
セッションを使い、Webサービスなどを提供する場合にはセキュリティに配慮する必要があります。
セッションはサーバー側にデータを保存できる便利な仕組みですが、場合によってはこれを悪用して個人情報を盗み見ることなどの犯罪に巻き込まれる恐れがあるのです。しばしばセッションは攻撃対象になることがあります。サービスを公開するには以下の基本的なセキュリティ対策をすると良いでしょう。
セッション固定攻撃は任意のセッションIDを利用させること
「セッション固定攻撃」というものがあります。通常はセッションが開始されたときにランダムでセッションIDが発行されますが、任意のセッションIDを強制的に利用させることで攻撃の手段にもなるのです。下で紹介するセッションハイジャックのために利用されることも多いです。
セッション固定攻撃が問題になるのはログイン前からセッションが有効になっており、ログインの前後でセッションIDが変わらず利用されている、という場合です。そこで、セッション固定攻撃を防ぐためにはログイン後にセッションIDの再発行を行うことが効果的です。
session_regenerate_id();
と記述することでセッションIDが再発行されます。
セッションハイジャックはセッションIDを取得して乗っ取ること
セッションを取得し、不正な操作をするのが「セッションハイジャック」です。セッション固定攻撃の対策をしていなければそれによりセッションハイジャックが行われることがあります。有効なセッションIDを取得されることでユーザーの個人情報の取得、改ざん、場合によってはクレジットカードを使用することも可能となります。
セッションハイジャックを防ぐにはセッションIDの再発行を行うことのほか、多重チェックをすると効果的です。
まとめ
セッションはsession_start()関数から始まり、セッション変数の定義や削除なども操作できます。session_regenerate_id()関数でセッションIDの発行ができ、セキュリティ対策にこの関数を施す場合も多いです。
セッションを利用する場合にはユーザーを保護するためにセッション固定攻撃やセッションハイジャック対策をしておくといいでしょう。