セッションIDの受渡し
セッションIDの通知を行うためには次の二つの方法があります。
- Cookies
- URLパラメータ
sessionモジュールは、両方の方法をサポートします。 Cookieは最適ですが、(クライアントがCookieを受け入れない可能性が あるため)信頼性がなく、これに依存することができません。2番目の方 法は、セッションIDを直接URLに埋め込みます。
PHPには、透過的にリンクを変換する機能を有しています。
この実行時オプション
session.use_trans_sid
が有効な場合、
相対URIは自動的にセッションIDを含むように変換されます。
注意:
arg_separator.output
php.ini
ディレクティブにより、引数セパレータをカスタマイズする ことができます。XHTMLに完全準拠するためには、ここに & を指定してください。
もしくは、セッションが開始している場合に定義されている定数 SID
を使用することもできます。クライアントが適当な
セッションクッキーを送信しなかった場合、この定数は session_name=session_id
の形式となります。
他方、送信された場合には、この定数は空の文字列に展開されます。
このため、この定数を無条件に URL に埋め込むことができます。
次の例は、変数の登録法および SID
を用いて他のページに正しくリンクする方法のデモです。
例1 単一のユーザーに関するヒット数を数える
<?phpsession_start();if (empty($_SESSION['count'])) { $_SESSION['count'] = 1;} else { $_SESSION['count']++;}?><p>こんにちは、あなたがこのページに来たのは <?php echo $_SESSION['count']; ?> 回目ですね。</p><p>続けるには、<a href="nextpage.php?<?php echo htmlspecialchars(SID); ?>">ここをクリック</A>してください。</p>
XSSに関係する攻撃を防止するためにSID
を出力する際に、
htmlspecialchars()を使用します。
PHPをコンパイルする際に
--enable-trans-sid を使用した場合、
上の例のように SID
を出力する必要はありません。
注意:
相対URLでないURLは外部サイトを指していると仮定され、
SID
が追加されません。これは、SID
を外部のサーバーに開示することはセキュリティ上のリスクとなる可能性があるためです。