PHPのセッションサポート機能は、複数回のアクセスを通じて特定のデー タを保持する手段を実現するものです。これにより、よりカスタマイズさ れたアプリケーションを構築し、自分の Web サイトのアピール度を増加 させることが可能となります。
PHPLIB のセッション管理に精通している場合には、そのコンセプトがPHPの セッションサポートに似ていることに気づくことでしょう。
Web サイトの訪問者にはセッションIDというユニークなIDが割りつけられ ます。このIDは、ユーザー側にクッキーとして保存するか、または、URL に埋め込みます。
セッションサポート機能により、任意の数の変数をリクエスト間で受けわたせる ようになります。来訪者がサイトにアクセスした際、 PHP は特定のセッションIDがリクエストとともに送信されているかどうかを (session.auto_start が 1 の場合は)自動的に、または (session_start() により明示的な、あるいは session_register() により暗黙の) 要求を受けて確認します。 このIDが送信されている場合には、以前保存された変数が再現されます。
全ての登録された変数は、リクエストが終了した後に、シリアル化されます。 未定義の登録変数は、未定義としてマーク付けされます。 後でユーザーがこれらの変数を定義しない限り、以降のアクセスにおいて セッションモジュールにより定義されません。
注意 セッション処理機能は、PHP 4.0 でサポートされました。
注意 セッションを処理している時、 session_register()関数を使用するか スーパーグローバル配列$_SESSIONへ新しいキーを 追加することにより変数が登録されるまで、セッションのレコードは作 成されないことに注意して下さい。これは、セッションが session_start()関数により開始されている場合で も真です。
セッションの使用は、セッションデータが対応するユーザのみに見るこ とができることを絶対的に保証できることを意味しません。 これは、重要な情報を保存したり表示する場合に留意すべき重要な事 実です。データをセッションに保存する場合、 この情報を他の誰かが見た場合に発生する損害は何かとか、 このセッションが実際には他の誰かの場合に、自分のアプリケーション がどのような影響を受けるかを常に自問する必要があります。
例えば、他の誰かがあるセッションを得た場合、そのユーザとして フォーラムにメッセージを投稿することができますが、その問題の大き さはどの程度でしょうか? または、彼は、元のユーザの買いものかごにアクセスできるため、その ユーザが注文しようとしていたものを見ることができるかもしれません。 明らかに、薬局よりも花屋の方が問題は小さいでしょう。
このため、重要な情報を処理する場合、有効なセッションかどうかを決 める他の方法を常に用意する必要があります。セッションはセキュアな 認証機構のように信頼できるものではありません。
セッションはセッションIDに基づいており、これは、セッションIDを盗 むことにより、セッションを「盗む」ことができることを意味します。 これは、セッションCookieを使用することにより困難となりますが、 不可能にするわけではなく、依然としてユーザが全てのブラウザウイン ドウを閉じて、セッションCookieを期限切れとすることに依存していま す。また、セッションCookieでさえもネットワークで盗聴されたり、 プロキシサーバにより記録されたりします。
これらの関数は、標準モジュールの一部と して利用可能であり、常に使用できます。
注意 オプションで、Ralf S. Engelschallにより開発されたセッションの保 存用の共有メモリ(mm)を使用することも可能です。 mmをダウンロードし、インストールす ることができます。このオプションは、Windowsプラットフォームでは 利用できません。
PHPのセッションサポートはデフォルトで有効となっています セッションサポートを有効にしてPHPを構築したくない場合には、 configureにオプション--disable-sessionを指定する必要があります。 セッション記憶領域として共有メモリ(mm)を使用するには、PHPのconfigure に--with-mm[=DIR]を指定します。
Windows版のPHPにはこの拡張モジュールのサポートが組み込まれています。これらの関数を使用するために拡張モジュールを追加でロードする必要はありません。
これらの関数の動作は、php.iniの設定により変化します。
表 1セッションの設定オプション
名前 | デフォルト | 変更の可否 |
---|---|---|
session.save_path | "/tmp" | PHP_INI_ALL |
session.name | "PHPSESSID" | PHP_INI_ALL |
session.save_handler | "files" | PHP_INI_ALL |
session.auto_start | "0" | PHP_INI_ALL |
session.gc_probability | "1" | PHP_INI_ALL |
session.gc_maxlifetime | "1440" | PHP_INI_ALL |
session.serialize_handler | "php" | PHP_INI_ALL |
session.cookie_lifetime | "0" | PHP_INI_ALL |
session.cookie_path | "/" | PHP_INI_ALL |
session.cookie_domain | "" | PHP_INI_ALL |
session.cookie_secure | "" | PHP_INI_ALL |
session.use_cookies | "1" | PHP_INI_ALL |
session.use_only_cookies | "0" | PHP_INI_ALL |
session.referer_check | "" | PHP_INI_ALL |
session.entropy_file | "" | PHP_INI_ALL |
session.entropy_length | "0" | PHP_INI_ALL |
session.cache_limiter | "nocache" | PHP_INI_ALL |
session.cache_expire | "180" | PHP_INI_ALL |
session.use_trans_sid | "0" | PHP_INI_SYSTEM|PHP_INI_PERDIR |
url_rewriter.tags | "a=href,area=href,frame=src,input=src,form=fakeentry" | PHP_INI_ALL |
セッション管理システムは、php.iniファイルに記述可能な多くの設定オ プションをサポートします。以下に概要を示します。
session.save_handler は、セッションに関連す るデータの保存および取得に使用されるハンドル名を定義します。デ フォルトは、filesです。 session_set_save_handler()も参照して下さい。
session.save_path は、保存ハンドラに渡される 引数を定義します。デフォルトのファイルハンドラを選択した場合、 ファイルが作成される場所のパスになります。デフォルトは、 /tmp です。 session.save_pathのパスの深さが2より大きい場 合、ガーベッジコレクションは行われません。 session_save_path()も参照して下さい。
警告 |
この設定を/tmp (デフォルト)のようにどこか らでも読み込み可能なディレクトリのままにしている場合、サーバ上 の他のユーザがこのディレクトリのファイルのリストを取得すること により、セッションをハイジャックをすることが可能となります。 |
注意 WindowsユーザがPHPのsession関数を使用するためには、この変数を変 更する必要があります。c:/tempのような有効 なパスを指定するようにして下さい。
session.name はセッション名を指定し、 クッキー名として使用されます。 アルファベット文字のみで指定する必要があります。 デフォルトは、PHPSESSID です。 session_name()も参照して下さい。
session.auto_start はリクエスト開始時に セッションモジュールがセッションを自動的に開始するかどうかを 指定します。デフォルトは、0(無効)です。
session.serialize_handler は、シリアル化また はシリアル化データを復元するために使用されるハンドラの名前を定 義します。現在、( phpという名前の)PHP 内部 フォーマットおよび(wddxという名前の)WDDX が サポートされています。WDDXは、PHP がWDDX サポート を有効にしてコンパイル されている場合のみ使用可能です。デフォルトは、 php です。
session.gc_probability は、gc (ガーベッジ・ コレクション)ルーチンが各リクエストにおいて開始される確率をパー セントで指定します。デフォルトは、1 です。
session.gc_maxlifetime は、データが'ごみ'と みなされてから消去されるまでの秒数を指定します。
注意 デフォルトのファイルに基づくセッションハンドラを使用している場 合、使用するファイルシステムは、アクセス時間(atime)を記録できる 必要があります。Windows FATはこれができないため、 FATファイルシステムまたはatimeの記録ができない他のファイルシス テムで問題を発生した場合は、セッションのガベージコレクト処理を 行う他の手段を用意する必要があります。
session.referer_check には、HTTP Referer に おいて確認を行う文字列を指定します。Refererがクライアントにより 送信されており、かつ、指定した文字列が見付からない場合、埋め込 まれたセッションIDは無効となります。デフォルトは空の文字列です。
session.entropy_file は、 セッションIDを作成する際の別のエントロピソースとして使用する 外部リソースへのパスを指定します。 例としては、多くの UNIX で利用可能な /dev/random または /dev/urandom があげられます。
session.entropy_length は、前記のファイルから 読みこむバイト数を指定します。デフォルトは、0 (無効)です。
session.use_cookiesによりクライアント側にセッ ションIDを保存する際にクッキーを使用するかどうかを指定します。デ フォルトは1 (有効)です。
session.use_only_cookiesは、 このモジュールがクライアント側へのセッションIDの保存に Cookieのみを使用することを指 定します。デフォルトは、0 (無効、下位互換性の ため)です。この設定を有効にすることにより、セッションIDをURLに埋 め込む攻撃を防ぐことができます。この設定は、 PHP 4.3.0で追加されました。
session.cookie_lifetimeは、ブラウザに送信す るクッキーの有効期間を秒単位で指定します。値0は、"ブラウザを閉じ るまで"を意味します。デフォルトは、0です。 session_get_cookie_params()および session_set_cookie_params()も参照して下さい。
session.cookie_pathによりsession_cokkieで設 定するパスを指定します。デフォルトは/です。 session_get_cookie_params()および session_set_cookie_params()も参照して下さい。
session.cookie_domainによりsession_cookieで 指定するドメインを指定します。デフォルトでは指定されません。 session_get_cookie_params()および session_set_cookie_params()も参照して下さい。
session.cookie_secureは、 セキュアな接続を通じてのみCookieを送信できるかどうかを指定します。 デフォルトは、offです。 この設定は、PHP 4.0.4で追加されました。 session_get_cookie_params()および session_set_cookie_params()も参照して下さい。
session.cache_limiterにより セッションページにおけるキャッシュ制御の方法 (none/nocache/private/private_no_expire/public) を指定します。デフォルトは、nocacheです。 session_cache_limiter()も参照して下さい。
session.cache_expireによりキャッシュされた セッションページの有効期間を分単位で指定します。 このオプションは、nocacheリミッタに関しては効果がありません。 デフォルトは、180です。 session_cache_expire()も参照して下さい。
session.use_trans_sidは、透過的なセッション IDの付加をするかどうかを指定します。 デフォルトは、0(無効)です。
注意 PHP 4.1.2より前のバージョンでは、このオプションは --enable-trans-sidにより コンパイル時に有効とされていました。 PHP 4.2.0以降、trans-sid機能は常にコンパイルされます。
URLに基づくセッション管理は、Cookieに基づくセッション管理と比べ てセキュリティリスクが大きくなります。例えば、ユーザは、emailに より友人にアクティブなセッションIDを含むURLを送信する可能性があ り、また、ユーザは自分のブックマークにセッションIDを含むURLを保 存し、常に同じセッションIDで使用するサイトにアクセスする可能性 があります。
url_rewriter.tagsは、透過的なセッションIDの 付加機能が有効となった場合に、セッションIDを含めるために書き換 えられるHTMLタグを指定します。デフォルトは、 a=href,area=href,frame=src,input=src,form=fakeentry です。
track_varsおよび register_globals 設定はセッション変数の保存および回復方法に影響を与えます。
注意 PHP 4.0.3以降、track_vars は常 にonとなっています。
これらの定数は、この拡張モジュールで定義されており、 この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー ドされるかのどちらかの場合のみ使用可能です。
Constant containing the session name and session ID in the form of "name=ID".
注意 PHP 4.1.0以降、$_SESSIONは、 $_POST, $_GET, $_REQUEST等のようにグローバル変数として利用可 能です。$HTTP_SESSION_VARSと異なり、 $_SESSIONは常にグローバルです。そこで、 global は$_SESSIONの場合は不要です。 このドキュメントでは、$_SESSION をあらゆる場 所で使用していることに注意して下さい。もし前者を使用したい場合に は、$_SESSIONを $HTTP_SESSION_VARSで置き換えることができます。
連想配列$_SESSIONのキーは、PHPの通常の変数名 と同じ制限があります。すなわち、数字で始まることはできず、文字ま たはアンダースコアで始まる必要があります。 詳細については、本マニュアルの 変数の節を参照して下さ い。
register_globals が無効の場合、グローバル連想配列$_SESSIONのメ ンバのみをセッション変数として登録することができます。 回復されたセッション変数は、配列$_SESSIONでの み利用可能です。
セキュリティとコードの可読性のために$_SESSION (またはPHP 4.0.6以前は$HTTP_SESSION_VARS)の使用 が推奨されます。$_SESSIONの場合、 session_register(), session_unregister(), session_is_registered()は不要です。ユーザは、 通常の変数と同様にセッション変数にアクセス可能 です。
register_globals が有効な場合、全てのグローバル変数はセッション変数として登録するこ とが可能で、セッション変数は対応するグローバル変数として回復されま す。PHPは、どのグローバル変数がセッション変数として登録されるのか を知る必要があるため、ユーザは、変数を session_register()関数で登録する必要がありま す。しかし、$_SESSIONの場合は、エントリを設定 するだけでこれを行う必要はありません。
注意 |
$_SESSIONを使用し、register_globals を無効とする場合、自分のスクリプトをPHP 4.2より以前のバージョン で動作させたい場合は、 session_register(), session_is_registered(), session_unregister()を使用しないで下さい。 PHP 4.3以降ではこれらの関数を使用することができます。 register_globals を有効にしている場合は、 session_unregister()を使用する必要があります。 これは、シリアル化されたセッションデータが戻される時にセッション 変数がグローバル変数として登録されるためです。 セキュリティ面と性能面の双方よりregister_globals を無効とすることが推奨されています。 |
例 4 register_globals が有効な場合に、変数を登録する
|
register_globals が有効な場合、グローバル変数と$_SESSIONの エントリは、前のセッションインスタンスで登録されたセッション変数 の同じ値を参照することになります。
加えて、session_register()により新しいセッショ ン変数を登録する場合、グローバルスコープのエントリと $_SESSIONのエントリは、次の session_start()まで同じ値へのリファレンスとは なりません。(これは、PHP 4.2より前のバージョンのみに適用されます。) すなわち、グローバル変数への修正は、$_SESSION のエントリには反映されません。これは、実際には問題にはならないと 思われますが、PHP 4.3では修正されています。
セッションIDの通知を行うためには次の二つの方法があります。
Cookie
URLパラメータ
sessionモジュールは、両方の方法をサポートします。 Cookieは最適ですが、(クライアントがCookieを受け入れない可能性が あるため)信頼性がなく、これに依存することができません。2番目の方 法は、セッションIDを直接URLに埋め込みます。
PHP は、 --enable-trans-sidを付けてコンパイルされた 場合にこの処理を透過的に行います。このオプションは、PHP 4.2以降常 に有効となっています。このオプションを有効にした場合、相対 URI はセッションIDを有するように自動的に変更されます。 もしくは、クライアントが適当なクッキーを送信しない場合に 定義される定数 SID を使用することができます。 SID は、session_name=session_id の形式または空の文字列です。
注意 arg_separator.output php.ini ディレクティブにより、引数のセパレータをカスタマイズ することが可能です。
次の例は、変数の登録法および SID を用いて他のページに正しくリンク する方法のデモです。
<?php echo SID?> (short_open_tagが有効な 場合は<?=SID?>を使用できます)は、 ユーザがCookieを無効とした場合にセッションIDを保存するために必要 です。PHPのコンパイル時に --enable-trans-sidを指定した場合には、 <?php echo SID?>は不要です。
注意 相対URLでないURLは、外部サイトを指していると仮定されSIDが追加 されません。これは、SIDを異なったサーバにもらすことはセキュリティ 上のリスクとなるためです。
セッション情報をデータベースに保存する機能か他の保存法を実装する には、一連のユーザレベルの保存関数を作成し、 session_set_save_handler()を使用する必要があり ます。