クッキーとセッション

クッキー

Cookieとは、ブラウザに保存される、
ウェブサイトから送られた情報の事である。

クッキーの設定方法

setcookie()関数で、設定できる。

例:「test」という名称で「2」という値を、30日間保存する。

setcookie('test',2,time() + 60 * 60 * 24 * 30);

第1引数には、値の名称を、第2引数には値を入力。

第3引数には、UNIX時間で保存期間を入力する。
この例の場合は、PHP公式ガイドそのままであるが、
time()から取得したUNIX時間に、
30日分を加算した値を入れている。

第3引数を省略、もしくは「0」を入力した場合、
ブラウザを閉じた時点で破棄される。

なお、第3引数以降は必須ではない。

第4引数:クッキーを有効にしたいディレクトリ
文字列で、ディレクトリパスを指定する事により、
クッキーを適用したい領域を指定する事ができる。

例えば/のみを指定すれば、全領域で使う事になり、
/contentを指定する事により、
「content」領域でのみクッキーを使えるようにできる。

第5引数:HTTPSのみで使用するか
trueを設定すると、HTTPSでのみ使用できるようにする。

第6引数:HTTPでしか使えないようにする
JavaScriptでクッキーを使わせたくない場合に、trueを設定する。

クッキーを削除する

クッキーを削除するには、setcookie()の第2引数に、空文字列を設定するとよい。

例:「test」のクッキーを削除する場合

setcookie('test','');

用途

クッキーはASCII文字列しか使えない。
つまり日本語文字列や、長いテキスト保存には向いていない。

また、ひとつのウェブサイトに対し、保存できるクッキーは20個までである。

要素そのものを格納するのではなく、要素を呼び出すためのフラグとして使うとよい。

クッキーを参照する

クッキーを参照するには、$_COOKIEを使うとよい。

例:「test」という名称のクッキーを取り出す場合

$test = $_COOKIE['test'];

セッション

サーバー側に保持される、訪問者の一時的な情報。
訪問者がブラウザを閉じるまで、保持される。

セッションを作成すると、同時にセッションIDというクッキーが発行される。
セッションIDは、ランダムで生成された文字列。
クッキーにあるこの値を照合して、
サーバー側に保存されたセッションが使用される事になる。

セッションの開始

セッションを開始するには、session_start()を実行する必要がある。
php.inisession.auto_startを1に設定してある場合は、この関数を記述する必要はない。

この関数を実行すると、クッキー側にセッションIDという、ランダム文字列が保存される。

この関数実行後に、スーパーグローバル変数の$_SESSIONを使用する事ができる。

セッションに保存・参照

スーパーグローバル変数$_SESSIONを、直に参照すればよい。

例:「test」という名称でセッションを格納する場合

session_start();
$_SESSION['test'] = 'テストテキスト';

例:「test」の中身を取り出す場合

session_start();
$test = $_SESSION['test'];

ブラウザを閉じない限り、画面遷移や別タブを展開しても、
セッションの値は保持されている。

なお、クッキーもセッション照合用の値を格納しているので、
クッキーを消せば、その時点のセッションも使えなくなる。

ログインの認証システムも・・・

ログインを行うための機能も、このクッキーやセッションを使用している。

ただし、クッキーやセッションに、パスワードをそのまま保存するのは、やめておこう
パスワードをクッキーやセッションに保存しておき、
ページ遷移ごとに認証を行う事でも、システム的には動くのだが、
特にクッキーの場合、仮にクロスサイトスクリプティングなどで
クッキー情報が奪われた場合、パスワードが漏洩する事になる。

こういう場合、ログイン処理を行った際に、
セッションにログイン状態を真偽値で保存しておく程度にしておいた方がよい。

セッションハイジャック対策

セッションハイジャックとは、何らかの方法でクッキーからセッションIDが奪われ、
そのセッションIDを使用して、認証などを潜り抜ける攻撃である。

対策のひとつとして、ログイン処理直後に、以下の関数を実行しておくとよい。

session_regenerat_id(true)

これはセッションIDを再発行する関数である。

クッキー情報を奪われたとしても、
攻撃者が実際に利用するまでに、多少の時間がかかると思われるため、
前回のログイン中に奪われたセッションだけでも、無効にしておく価値はある。

他にはSSL化するといった対策もあるが、SSL化するにも有料の証明書が必要なので、
ひとまずは、ログイン直後に上記関数を実行するようにしておくとよい。

ただ、各ページに配置すると、
リンクを連打した際などにセッションエラーが発生する場合もある。