PHPのセッションサポート機能は、複数回のアクセスを通じて特定のデー タを保持する手段を実現するものです。これにより、よりカスタマイズさ れたアプリケーションを構築し、自分の Web サイトのアピール度を増加 させることが可能となります。
PHPLIB のセッション管理に精通している場合には、そのコンセプトがPHPの セッションサポートに似ていることに気づくことでしょう。
Web サイトの訪問者にはセッションIDというユニークなIDが割りつけられ ます。このIDは、ユーザー側にクッキーとして保存するか、または、URL に埋め込みます。
セッションサポート機能により、任意の数の変数をリクエスト間で受けわたせる ようになります。来訪者がサイトにアクセスした際、 PHP は特定のセッションIDがリクエストとともに送信されているかどうかを (session.auto_start が 1 の場合は)自動的に、または (session_start() により明示的な、あるいは session_register() により暗黙の) 要求を受けて確認します。 このIDが送信されている場合には、以前保存された変数が再現されます。
全ての登録された変数は、リクエストが終了した後に、シリアル化されます。 未定義の登録変数は、未定義としてマーク付けされます。 後でユーザーがこれらの変数を定義しない限り、以降のアクセスにおいて セッションモジュールにより定義されません。
設定ファイルの設定値 track_vars および register_globals によりセッション変数の回復方法を指定します。
注意 PHP 4.0.3以降、track_varsは常 に on となりました。
注意 PHP 4.1.0以降、$_SESSIONは、$_POST, $_GET, $_REQUEST等のようにグ ローバル変数として利用可能です。$HTTP_SESSION_VARSと異なり、 $_SESSIONは常にグローバルです。そこで、 globalは$_SESSIONの場合は不要です。
track_vars が有効で register_globals が無効の場合、グローバル変数配列$HTTP_SESSION_VARSのメンバーのみを セッション変数として登録可能です。回復されたセッション変数は配列 $HTTP_SESSION_VARSでのみ利用可能です。
例 1 track_vars が有効な時に変数を登録する
|
セキュリティとコードの可読性のために$_SESSION(またはPHP 4.0.6以前 は$HTTP_SESSION_VARS)の使用が推奨されます。$_SESSIONまたは $HTTP_SESSION_VARSの場合、 session_register()/session_unregister()/session_is_registered()は 不要です。ユーザは、通常の変数と同様にセッション変数にアクセス可能 です。
register_globals が有効な場合、全てのグローバル変数はセッション変数として登録するこ とが可能で、セッション変数は対応するグローバル変数として回復されま す。PHPは、どのグローバル変数がセッション変数として登録されるのか を知る必要があるため、ユーザは、変数をsession_register()関数で登録 する必要があります。しかし、 $HTTP_SESSION_VARS/$_SESSION の場合は、session_register()を使用する必要はありません。
注意 |
$HTTP_SESSION_VARS/$_SESSION を使用し、register_globals を無効とする場合、 session_register(), session_is_registered(), session_unregister()を使用しないで下さい。 register_globals を有効にしている場合は、 session_unregister()を使用する必要があります。 これは、シリアル化されたセッションデータが戻される時にセッション 変数がグローバル変数として登録されるためです。 セキュリティ面と性能面の双方よりregister_globals を無効とすることが推奨されています。 |
例 4 register_globals が有効な場合に、変数を登録する
|
track_varsと register_globals が共に有効な場合、グローバル変数と $HTTP_SESSION_VARS/$_SESSION エントリは登録済みの変数の同じ値を参照することになります。
ユーザがセッション変数を登録する際にsession_register()を使用する場合、 $HTTP_SESSION_VARS/$_SESSION は、セッションのストレージからロードされるまで(すなわち次のリクエ ストまで)配列内にこれらの変数を有しません。
セッションIDの通知を行うためには次の二つの方法があります。
クッキー
URLパラメータ
セッションモジュールは、両方の方法をサポートします。 クッキーは最適ですが、(クライアントがクッキーを受け入れない可能性が あるため)信頼性がなく、頼ることができません。二番目の方法は、 セッションIDを直接URLに埋め込みます。
PHP は、 --enable-trans-sidを付けてコンパイルされた 場合にこの処理を透過的に行います。 このオプションを有効にした場合、相対 URI はセッションIDを有するように 自動的に変更されます。 もしくは、クライアントが適当なクッキーを送信しない場合に 定義される定数 SID を使用することができます。 SID は、session_name=session_id の形式または空の文字列です。
次の例は、変数の登録法および SID を用いて他のページに正しくリンク する方法のデモです。
PHPのコンパイル時に --enable-trans-sidを指定した場合には、 <?php echo SID?> は必要ありません。
注意 相対URLでないURLは、外部サイトを指していると仮定されSIDが追加 されません。これは、SIDを異なったサーバにもらすことはセキュリティ 上のリスクとなるためです。
セッション情報をデータベースに保存する機能か他の保存法を実装するに は、一連のユーザレベルの保存関数を作成し、 session_set_save_handler()を使用する必要があり ます。
セッション管理システムは、php.ini ファイルに記述可能な多くの設定オ プションをサポートします。以下に概要を示します。
session.save_handler は、セッションに関連す るデータの保存および取得に使用されるハンドル名を定義します。デ フォルトは、filesです。
session.save_path は、保存ハンドラに渡される 引数を定義します。デフォルトのファイルハンドラ選択した場合、 ファイルが作成される場所のパスになります。デフォルトは、 /tmp です。 session.save_pathのパスの深さが2より大きい場 合、ガーベッジコレクションは行われません。
警告 |
この設定を/tmp (デフォルト)のようにどこか らでも読み込み可能なディレクトリのままにしている場合、サーバ上 の他のユーザがこのディレクトリのファイルのリストを取得すること により、セッションをハイジャックをすることが可能となります。 |
session.name はセッション名を指定し、 クッキー名として使用されます。 アルファベット文字のみで指定する必要があります。 デフォルトは、PHPSESSID です。
session.auto_start はリクエスト開始時に セッションモジュールがセッションを自動的に開始するかどうかを 指定します。デフォルトは、0(無効)です。
session.cookie_lifetimeは、ブラウザに送信す るクッキーの有効期間を秒数で指定します。値0は、"ブラウザを閉じ るまで"を意味します。デフォルトは、0です。
session.serialize_handler は、シリアル化また はシリアル化データを復元するために使用されるハンドラの名前を定 義します。現在、( phpという名前の)PHP 内部 フォーマットおよび(wddxという名前の)WDDX が サポートされています。WDDXは、PHP がWDDX サポート を有効にしてコンパイル されている場合のみ使用可能です。デフォルトは、 php です。
session.gc_probability は、gc (ガーベッジ・ コレクション)ルーチンが各リクエストにおいて開始される確率をパー セントで指定します。デフォルトは、1 です。
session.gc_maxlifetime は、データが'ごみ'と みなされてから消去されるまでの秒数を指定します。
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.cookie_pathによりsession_cokkieで設定する パスを指定します。デフォルトは/です。
session.cookie_domainによりsession_cookieで指定する ドメインを指定します。デフォルトでは指定されません。
session.cache_limiterにより セッションページにおけるキャッシュ制御の方法(nocache/private/public) を指定します。デフォルトは、nocacheです。
session.cache_expireによりキャッシュされた セッションページの生存期間を分単位で指定します。 このオプションは、nocacheリミッタに関しては効果がありません。 デフォルトは、180です。
session.use_trans_sidは、 --enable-trans-sidを指定してコンパイ ルを行うことにより有効となった場合に、透過的なセッション IDの付加をするかどうかを指定します。 デフォルトは、1(有効)です。
url_rewriter.tagsは、透過的なセッションIDの 付加機能が有効となった場合に、セッションIDを含めるために書き換 えられるHTMLタグを指定します。デフォルトは、 a=href,area=href,frame=src,input=src,form=fakeentry です。
注意 セッション処理機能は、PHP 4.0 でサポートされました。