読者です 読者をやめる 読者になる 読者になる

session.use_trans_sidは外部ドメインへのformタグにも無差別に付加する

phpのセッション処理関数には、session.use_trans_sidという設定がある。
http://jp.php.net/session#ini.session.use-trans-sid

Cookieが使えない環境、つまり携帯などで、セッションIDを aタグなどの相対パスに自動で付加してくれる。
DoCoMoの端末ではセッションが使えないし、au、SoftBankSSLなどをまたぐと微妙な挙動をするので、基本的にモバイルサイトを作る場合には、セッションIDをURLに付けて引き回すという対応をすることが多い。


いままで、自作のフィルタを使っていたのだが、今回の案件で、session.use_trans_sidを使ってみることになった。
それでも相対パスのみなので、指定済みの絶対パスにも付与するという自作フィルタのテストをしているときに、妙な挙動を見つけた。


formタグにhiddenタグを追加するという動きで、action先が絶対パスでもセッションIDを付与してしまうのだ。
これは結構やばいと思う。


日本語訳されたドキュメントの範囲では見つけることができず、User Contributed Notesには、それらしいことが書いてあった。
http://jp.php.net/session#75497

spam at chovy dot com
02-Jun-2007 04:01
Regarding xhtml validation errors with w3c validator:

The problem is the validator doesn't support cookies, so our session_start() mechanism injects hidden input fields just below all form tags (and in urls).

You need to do two things to pass validation:

1) use fieldsets around *all* input fields (for xhtml 1.0+) to pass validation
2) then, before session_start() change the url_rewriter.tags list of tags to drop form and add fieldset:

ini_set("url_rewriter.tags", "a=href,area=href,frame=src,fieldset=");
session_start();

You can also set url_rewriter.tags anywhere, (see appendix for php.ini)


つまり、無差別に付けるから、url_rewriter.tagsの設定で外したほうがいいよということだ。


結局、今回は、url_rewriter.tagsからformを外し、aタグの登録済み絶対パスと、formのactionは相対パスと登録済み絶対パスのときに、それぞれ、セッションIDを付与するという対応をした。


会員制のモバイルサイトで、外部サイトへ接続するformがある場合には、セッションIDが漏れる危険性がある。
これって、一般的に認知されているのだろう?