PHP スーパーグローバル変数-$_SESSION

今回は、スーパーグローバル変数の$_SESSIONの解説です。
前回の$_COOKIEによく似た特徴を持つスーパーグローバル変数です。

この記事の著者 ->S.E; です。
普段は、システム開発に必要なヒアリング、システムの要件定義、設計からプログラマとしてWebサイトやWebアプリケーションの開発、WordPressでのブログの執筆やサーバー運用・管理を行っています。
このページは「未経験の為のプログラミング講座 ゼロから始めるPHPプログラミング〜初級から実践編までを網羅〜」としてPHPの基本的な部分を【初級編】【中級編】【上級編】に分けて解説しています。最終的には簡単なフォームやシステム開発をフルスクラッチで行うことを目的としています。また、参考になる書籍なども紹介しています。
$_SESSION(セッション)とは?
$_SESSION(セッション)は$_COOKIEとよく似た特徴を持ちますが、主な違いは下記のようになります。
$_SESSION | $_COOKIE | |
---|---|---|
データの保存先 | サーバー側に保存 | クライアント側に保存 |
保存データの特徴 | サーバー側に保存されるため改竄が不可能 | クライアント側に保存されるため改竄が可能 |
保存データの期限 | ブラウザを閉じるまで、もしくはサーバー側での設定期間を過ぎるまで | 設定時に依存 |
セキュリティー | クッキーよりもセキュア | ネットワーク上を流れるため盗聴される可能性がある |
$_SESSION(セッション)の基本
$_SESSION(セッション)を利用するにはまず、利用を宣言する必要があります。
下記が$_SESSION(セッション)を利用するための宣言となり、変数$_SESSION(セッション)を記述する前に記載する必要がります。
1 2 3 4 | <?php session_start(); ?> |
$_SESSION(セッション)へのデータの保存
下記のコードはPOST形式で送信されたデータを$_SESSION(セッション)へ保存しブラウザ常に表示するためのものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php session_start(); if( $_SERVER['REQUEST_METHOD'] == 'POST' ){ $_SESSION['session_test'] = $_POST['session_test']; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>セッションの基本</title> </head> <body> <p>保存されたセッション:<?php echo $_SESSION['session_test'];?></p> <form action="./" method="post"> <input type="text" name="session_test" value=""> <input type="submit" value="送信"> </form> </body> </html> |
$_SESSION(セッション)の動作確認
入力エリアに任意の文字列を入力し送信します。

送信されたデータは$_SESSIONに保存され、<?php echo $_SESSION[‘session_test’];?>部分に表示されます。

この「$_SESSION[‘session_test’]」に保存された情報はブラウザを閉じるか、サーバー側の設定の期間有効となります。
$_SESSION(セッション)の仕組み
ではサーバー側に保存された情報をどのような仕組みでブラウザ側は受け取っているか解説します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php session_start(); if( $_SERVER['REQUEST_METHOD'] == 'POST' ){ $_SESSION['session_test'] = $_POST['session_test']; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>セッションの基本</title> </head> <body> <p>セッションID:<?php echo $_COOKIE['PHPSESSID'];?></p> <p>保存されたセッション:<?php echo $_SESSION['session_test'];?></p> <form action="" method="post"> <input type="text" name="session_test" value=""> <input type="submit" value="送信"> </form> </body> </html> |
上記のスクリプトのページにアクセスすると「セッションID」が発行されます。セッションIDはCOOKIEに保存され $_COOKIE[‘PHPSESSID’]で表示可能です。

次に何かしらの文字列を送信します。$_SESSIONに保存された情報が表示されています。
この時セッションIDに変化はありません。

再度、別の文字列を送信します。やはりセッションIDに変化はありません。

サーバー側に保存された$_SESSIONのデータは、このセッションIDはクライアントごとに発行され、サーバー側はリクエストのあった$_SESSIONのデータをセッションIDを元にクライアントを識別しレスポンスします。
セッションハイジャック
$_COOKIEよりも$_SESSIONの方がセキュアであると説明しましたが、誤ってセッションIDをパラメータに付与し送信したり、何らかの方法でセッションIDを盗まれた場合は、「なりすまし」を行うことができます。
AクライントとBクライアントが同じセッションIDを利用した場合、全く同じ条件でデータを取得することができます。これがセッションハイジャックと言います。
セッションハイジャックへの対応方法
このセッションハイジャックに対応するには、プログラム側で常にセッションIDを変更し続けることで回避することができます。
session_regenerate_id 関数を利用することで、セッションIDを再生成することができます。
また、session_regenerate_id 関数を利用する際は「session_regenerate_id(true)」として古いセッションIDは削除するようにしましょう。下記が「session_regenerate_id 関数」の利用例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?php session_start(); if( $_SERVER['REQUEST_METHOD'] == 'POST' ){ $_SESSION['session_test'] = $_POST['session_test']; } session_regenerate_id(true); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>セッションの基本</title> </head> <body> <p>セッションID:<?php echo $_COOKIE['PHPSESSID'];?></p> <p>保存されたセッション:<?php echo $_SESSION['session_test'];?></p> <form action="" method="post"> <input type="text" name="session_test" value=""> <input type="submit" value="送信"> </form> </body> </html> |
任意のデータを送信して$_SESSIONにデータを保存しておきます。
この的に表示されているセッションIDは下記の内容です。

このページのURLに直接アクセスしてみます。$_SESSIONの情報はそのままに、セッションIDが変わっています。

このように、セッションIDを常に変化させれば、セッションIDを盗まれた場合でも、サーバー側に保存している情報を守ることができます。
$_SESSIONを利用してみて
$_SESSIONはショッピングカートや、会員のログインなど利用する部分は多岐に渡るため、必ず覚えておきましょう。また、$_COOKIEや$_SESSIONを利用する場合は、セキュリティーにも配慮必要があることも忘れてはいけません。
S.E->お勧め記事;
- macOS Monterey にアップデート後、composerやhomebrewでenv: php: No such file or directoryが出る
- PHPフレームワーク「Laravel」ディレクティブ-繰り返し処理(ループ処理)-
- プログラマー になる為に必要な プログラミング以外 の知識・スキル
- PHP フレームワーク Laravel ディレクティブ – ループ変数 $loop –
- CrowdWorks いつの間にか「プロクラウドワーカー」になっていた
- XSERVERにSSHを利用してLaravel環境を構築する
- Panic Nova 購入から1年が過ぎライセンスの更新時期の注意点
- Shopify APIを利用して在庫管理を行う
- CrowdWorks 提案後、受注に繋がりました。提案〜契約までの流れを解説
S.E->PR;
チームのタスク管理ツール【backlog】
FREENANCE(フリーナンス)
S.E->Weekly Ranking;
S.E->プロフィール;

