PHP入門 リクエスト情報 セッション情報($_SESSION)

ユーザーがブラウザを開いている間だけ情報を維持したい場合には、クッキーではなく、セッション(Session)という仕組みを利用します。

クッキーの問題点

データがクライアント側で保存される

クッキーはクライアント側で管理されるデータです。クライアントの設定によってはそもそもクッキーを受け入れないようにすることも可能ですし、いったん保存されたクッキーをクライアント側で改ざんしたり削除したりすることもできます。

実データがネットワーク上を流れる

クッキーはネットワーク上で受け渡しされます。つまり、通信経路にリクエスト情報をロギングするような通信機器やソフトウェアがあった場合、クッキー内容が盗聴されます。このようにセキュリティホールの一因となる場合もあります。そこでクッキーではなく、セッションという仕組みを利用します。ネットワーク上を流れるのは、このセッションIDのみでユーザー情報については、ネットワーク上を行き来しないので、データが盗聴される危険性が低くなります。

セッションの仕組み

セッションは、1回目のリクエストでセッションIDを発行します。セッションIDはPHPSESSIDという名前でクライアントのクッキーにセットされます。2回目以降の要求時には、PHPSESSIDをクライアントからサーバーに向けて発信し、サーバー側はPHPSESSIDをキーにして、アクセスしてきたユーザーを識別します。

構文:session_start関数

session_start([array $options]): bool
$options動作オプション

session_start関数は、setcookie関数やheader関数と同じく、ブラウザにデータを出力する前に呼び出されなければなりません。

セッション情報の読み書き

セッション機能を利用するには、あらかじめsession_start関数でセッションを開始しておく必要があります。セッションが開始されれば、変数$_SESSIONに対して値を設定/参照する要領で読み書きできます。

sample1.php

<?php 
require_once './Encode.php';
session_start();
?>
<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<title>セッション情報</title>
</head>
<body>
<form method="POST" action="sample2.php">
    <label for="email">メールアドレス</label>
    <input id="email" type="text" name="email" size="40" value="<?=e($_SESSION['email'] ?? '') ?>" />
    <input type="submit" value="送信" />
</form>
</body>
</html>

sample2.php

<?php 
session_start();
$_SESSION['email'] = $_POST['email'];
?>
<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<title>セッション情報</title>
</head>
<body>
    セッション情報を保存しました。
</body>
</html>
実行結果
初期画面
実行結果
メールアドレスを入力
実行結果
送信ボタン後の画面
実行結果
2回目以降の初期画面

session_regenerate_id関数を利用することで、セッションIDをセッションの途中で再作成することもできます。短い時間でセッションIDを切り替えることで、なりすましの可能性を抑制できます。

session_regenerate_id(true);

引数のtrueは、古いセッションを削除することを意味します。特別な意図がない限り、この部分はtrue固定としておけば問題ありません。

セッションを破棄する

例:セッションをその場で破棄する

session_destroy.php

<?php
session_start();
//セッション変数を空に
$_SESSION = [];                        //➊
if(isset($_COOKIE[session_name()])){   //➋
  $cparam = session_get_cookie_params();
  setcookie(session_name(),'', time() - 3600,
    $cparam['path'], 
    $cparam['domain'],
    $cparam['secure'], 
    $cparam['httponly']
  );
}
//セッションを破棄
session_destroy();

セッション動作後に、「session_destroy.php」にアクセスすると保存されているメールアドレスが表示されなくなります。これで、セッション破棄されていることを確認できます。

構文:session_destroy()関数

session_destroy(): bool

ただし、session_destroy関数はセッションを保存したファイルを削除するだけで、メモリ上のセッションは残っています。そこで、完全にセッションを削除するために、セッション変数を空にするともに、セッションクッキーを破棄する必要があります。isset関数は変数が存在するかどうかを判定するための関数で、session_name関数は現在のセッション名を取得するための関数です。

❷ではセッションクッキーが存在するかどうか判定し、存在する場合にはそのクッキーをsetcookie関数で破棄します。セッションクッキーの情報を取得するには、「session_get_cookie_params関数」を使用します。

セッション関連の設定パラメーター

PHPでは、セッションの挙動を制御するために、php.ini上の設定パラメーターが用意されています。

1、セッションの有効期限を設定する(session.gc_xxxxxxパラメーター)

セッション情報にはあらかじめ有効期限というものが決められています。セッションにアクセスしない状態がこの有効期限以上続いたところで、セッション情報はガベージコレクションによって自動的に破棄されます。

session.gc_xxxxxは、ガベージコレクターのためのphp.iniパラメーターです。まず、セッション情報をゴミとみなすまでの秒数を表すのは、session.gc_maxlifetimeパラメーターです。既定では1440秒(=24分)なので、24分以上アクセスがなかった場合にセッション情報はゴミとみなされます。もっとも、ゴミとなったセッション情報も、即座に削除されるわけではありません。ガベージコレクションの実行確率は、session.gc_probability/session.gc_divisorパラメーターによって決定します。既定ではこれらの値は1/100なので、ガベージコレクターは「セッション開始時に100分の1の確率」で起動します。

2、session.save_path

セッション関数は、既定でセッション情報をファイルとして保存します。session.save_pathパラメーターは、セッションの保存先を表すパラメーターです。ここで指定したパスが存在しない場合、セッション関数はエラーになります。

3、session.cookie_xxxxx

セッションクッキーにかかわる設定

パラメーター名概要既定値推奨値
session.cookie_lifetime有効期限00
session.cookie_path有効なパス“/”
session.cookie_domein有効なドメイン“”(現在のドメイン)“”
session.cookie_secure暗号化通信でのみクッキーを送信するかOffOn(HTTPS環境の場合)
session.cookie_httponlyHTTPクッキーを有効にするかOffOn
session.cookie_samesiteクロスサイトリクエストでクッキーを送信を制限するか(Lax:制限/Strict:厳密な制限)“”(送信)Lax/Strict

session.cookie_lifetimeの既定値である0は、ブラウザーを閉じるまでクッキーが有効であることを表します。ブラウザー閉じたあともセッションクッキーを残すことは、セキュリティ的に脆弱性につながる可能性があるので、通常、この値を変更することはありません

4、session.use_only_cookies

このパラメータをOnにした場合、セッションIDの受け渡しにクッキーだけを使用します。PHPでは、クッキーを使えないクライアントのために、セッションIDをURL経由で受け渡しする仕組みを備えています。

http://localhost/session.php?PHPSESSID=ode8ecfpkekso78desc5sekm02

5、session.sid_xxxxx/session.user_strict_mode

セッションIDの生成、扱いにかかわるパラメーターとして、次のようなパラメーターがあります。

セッションIDにかかわるパラメーター

パラメーター名概要既定値推奨値
session.sid_lengthセッションIDの長さ(22~256)3248(最低32)
session.sid_bits_per_characterセッションIDで利用できる文字当たりのビット数(4~6)46
session.use_strict_mode未初期化のセッションIDを拒否するかOffOn

session.sid_bits_per_characterのビット数とは、要はセッションIDで利用できる文字の種類を表します。4であれば「0~9、a~f」ですし、5であれば「0~9、a~v」、6は「0~9、a~z、A~Z、-、,」と扱える文字が増えていきます。session.use_strict_modeは、サーバー側で生成していないIDが送信された場合に受け入れるかを表します。一般的にOffの状態はID偽造の危険を残すだけなので、Onとしておきます。

6、session.use_trans_sid

このパラメーターをOnにした場合、クッキーからセッションIDを取得できなかった場合に、ページ上の相対パスに対してセッションIDが埋め込まれます。