クッキーを受け取る、送る時の重要な条件の一つとしてドメインチェックがある。
例えば、http://www1.xcatsan.co.jp/ から Domain=www1.xcatsan.co.jp のクッキーを受け取った後、このサイトへアクセスする時にはこのクッキーを送る。またhttp://www2.xcatsan.co.jp/ へアクセスする時にはこのクッキーは送らない。
一方、Domain=.xcatsan.co.jp が送られてきた場合には、http://www1.xcatsan.co.jp/, http://www2.xcatsan.co.jp/ 共にこのクッキーを送る。
問題なのは Domain=.co.jp といったクッキーが送られてきた場合。このようなクッキーをもしブラウザが受け取ってしまうと、先の2つのサイトはもちろん http://www.yahoo.co.jp/ や http://www.apple.co.jp/ といった .co.jp を持つすべてのサイトに対してこのクッキーを送ってしまう。
これはセキュリティの問題と認識されていて様々なサイトでも取り上げられている。
(ややふるい情報ばかりだが)
- IEやMozillaなどにセキュリティ・ホール,なりすましを許す可能性あり
- 第3回 犯罪者に代わって操作させられる「セッション・フィクセーション」
- Cookie Monster
- intel.co.jp のクッキーがおかしい
ドメインのルールについては以前紹介した [Studyng HTTP] HTTP Cookies で
DOMAIN_NAME に指定できる文字列は、トップレベルドメインが
"com", "edu", "net", "org", "gov", "mil", "int" の場合はピリオドが2つ以上、
それ以外の場合はピリオドが3つ以上含まれていなければいけません。
従って例えば、domain=jp 等と指定する事はできません。
となっていた。
これを具体的な例に落とすと
.com => NG(.が1個)
xcatsan.com => NG(.が1個)
.xcatsan.com => OK(.が2個)
.co.jp => NG(非gTLDで .が2個)
xcatsan.co.jp => NG(非gTLDで .が2個)
.xcatsan.co.jp => OK(非gTLDで .が3個)
.xcatsan.jp => NG(非gTLDで .が2個)
となる。
ただ最近は xcatsan.jp のようなドメインも存在する。
実際 Safari4のクッキー(Cookies.plist)を見ると、.xcatsan.jp のような非gTLDでかつ . が2個のケースも許容していた。
となると .co.jp (NG) と .xcatsan.jp (OK) の区別は gTLDと . の数だけの判断だけではできなくて、TLD別に細かく判断していく必要がある(JPドメインの場合、co や ne といった定義済みドメインなのか、そうでないか、といった判断)。
うーむ。これを自前で実装するのは面倒だし、国毎のドメイン事情が変わった場合などの後々のメンテナンスも難しい。できれば ルール適用のロジックは Foudation Framework側(すなわち NSHTTPCookie)にまかせたい。
現在の自前実装では、クッキーの受取は基本的に NSHTTPCookie まかせになっている。 そこでもしここで Safari4と同等のルール(すなわち、.co.jp は NGで、.xcatsan.jp は OK)を適用しているならそれにまかせて送出時には特になにもしない(今のままの)実装としよう。
この辺りの挙動を調べてみよう。
(そもそも Safari4の挙動はどうなっているのか?)