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

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

この記事の著者 ->S.E; です。

普段は、システム開発に必要なヒアリング、システムの要件定義、設計からプログラマとしてWebサイトやWebアプリケーションの開発、WordPressでのブログの執筆やサーバー運用・管理を行っています。

このページは「未経験の為のプログラミング講座 ゼロから始めるPHPプログラミング〜初級から実践編までを網羅〜」としてPHPの基本的な部分を【初級編】【中級編】【上級編】に分けて解説しています。最終的には簡単なフォームやシステム開発をフルスクラッチで行うことを目的としています。また、参考になる書籍なども紹介しています。

$_SESSION(セッション)とは?

$_SESSION(セッション)は$_COOKIEとよく似た特徴を持ちますが、主な違いは下記のようになります。

$_SESSION$_COOKIE
データの保存先サーバー側に保存クライアント側に保存
保存データの特徴サーバー側に保存されるため改竄が不可能クライアント側に保存されるため改竄が可能
保存データの期限ブラウザを閉じるまで、もしくはサーバー側での設定期間を過ぎるまで設定時に依存
セキュリティークッキーよりもセキュアネットワーク上を流れるため盗聴される可能性がある
$_SESSION(セッション)と$_COOKIEの主な違い

$_SESSION(セッション)の基本

$_SESSION(セッション)を利用するにはまず、利用を宣言する必要があります。
下記が$_SESSION(セッション)を利用するための宣言となり、変数$_SESSION(セッション)を記述する前に記載する必要がります。

$_SESSION(セッション)へのデータの保存

下記のコードはPOST形式で送信されたデータを$_SESSION(セッション)へ保存しブラウザ常に表示するためのものです。

$_SESSION(セッション)の動作確認

入力エリアに任意の文字列を入力し送信します。

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

この「$_SESSION[‘session_test’]」に保存された情報はブラウザを閉じるか、サーバー側の設定の期間有効となります。

$_SESSION(セッション)の仕組み

ではサーバー側に保存された情報をどのような仕組みでブラウザ側は受け取っているか解説します。

上記のスクリプトのページにアクセスすると「セッションID」が発行されます。セッションIDはCOOKIEに保存され $_COOKIE[‘PHPSESSID’]で表示可能です。

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

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

サーバー側に保存された$_SESSIONのデータは、このセッションIDはクライアントごとに発行され、サーバー側はリクエストのあった$_SESSIONのデータをセッションIDを元にクライアントを識別しレスポンスします。

セッションハイジャック

$_COOKIEよりも$_SESSIONの方がセキュアであると説明しましたが、誤ってセッションIDをパラメータに付与し送信したり、何らかの方法でセッションIDを盗まれた場合は、「なりすまし」を行うことができます。
AクライントとBクライアントが同じセッションIDを利用した場合、全く同じ条件でデータを取得することができます。これがセッションハイジャックと言います。

created by Rinker
Webアプリケーションにはなぜ脆弱性が生まれるのか?脆弱性を解消するにはどうプログラミングすればよいか?PHPサンプルへの攻撃を通して脆弱性が生まれる原理と具体的な対処方法が学べる!
created by Rinker
「この目的を実現するためには、どの文法テクニックが適合しやすいだろう」?「このプログラムをより読みやすくするために、どんなアプローチができるだろう」?といったことを思考しつつ、「とりあえずは動く」だけで終わらない、現場に求められる品質を形にするための知識とテクニックを解説します。
created by Rinker
Webアプリケーションの定番言語であるPHPの基礎から実践までを、上下巻のフルボリュームで集大成。「この目的を実現するためには、どの文法テクニックが適合しやすいだろう」?「このプログラムをより読みやすくするために、どんなアプローチができるだろう」?

セッションハイジャックへの対応方法

このセッションハイジャックに対応するには、プログラム側で常にセッションIDを変更し続けることで回避することができます。

session_regenerate_id 関数を利用することで、セッションIDを再生成することができます。
また、session_regenerate_id 関数を利用する際は「session_regenerate_id(true)」として古いセッションIDは削除するようにしましょう。下記が「session_regenerate_id 関数」の利用例です。

任意のデータを送信して$_SESSIONにデータを保存しておきます。
この的に表示されているセッションIDは下記の内容です。

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

このように、セッションIDを常に変化させれば、セッションIDを盗まれた場合でも、サーバー側に保存している情報を守ることができます。

$_SESSIONを利用してみて

$_SESSIONはショッピングカートや、会員のログインなど利用する部分は多岐に渡るため、必ず覚えておきましょう。また、$_COOKIEや$_SESSIONを利用する場合は、セキュリティーにも配慮必要があることも忘れてはいけません。

created by Rinker
PHP7の基本構文から、クラス、DB連携、セキュリティ対策まで、しっかり習得! PHPプログラミングの標準教科書『独習PHP』が、最新のPHP7に対応。PHPでWebページ/アプリケーションを開発する際に必要な基礎的な知識、PHPの基本構文から、クラス、データベース連携、セキュリティまで、詳細かつ丁寧に解説します。
created by Rinker
時間がなくたって、プログラミングは学べます。学習を躊躇していた人たちに、既存の入門書で挫折した人たちに、「これならできる!」の最短カリキュラムを、土日の14時間で提供。まったくのプログラミング初心者が簡単なWebデータベースアプリを構築できるまでの成長コースを、手取り足取り、導きます。

コメントする

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)