hamada
bungu****@leo*****
2006年 3月 25日 (土) 18:53:45 JST
こんにちわ。 On Tue, 21 Mar 2006 13:14:12 +0900 Seiji Sogabe <sogab****@alles*****> wrote: > Session Fixation攻撃 コレ、以前から気になってました。 常識的に考えて 「クライアントから渡されたセッションIDが現在有効なセッションと一致しない 場合、そのセッションIDは妙→新たにセッションを生成すべき」 な気がするんすが、PHPはなにも疑問を抱かず、言われた通りのセッションIDで 律義にセッションを作成しちゃうと言う。 「クローラーによるセッションIDの重複(セッション・ハイジャック)問題」 も、そもそもコレがあるから発生しちゃうんですよね。 1ヶ月も2ヶ月も前に取られたセッションID→もはや有効であるハズが無いのに、 クライアントの申告IDをそのまま無条件使用するからダブっちゃう。 こういうのを「パーミッシブなセッションID管理」と言うそうで、確かにこの仕 様のほうが便利な事もあるとは思いますが、やっぱちょっと拙いような。 現在のosCの対策はSpiderKillerとsession.referer_checkですが、前者は登録さ れたクローラーにしか効かない→未登録クローラーや悪意の攻撃にはまったく無 力ですし、後者はブラウザがRefererを返さない場合、動作しません。 (勿論クローラーに拾ってもらうURLがシンプルなのに越したことはないですし、 クライアントの多くがRefererを返してくれる→上記対策がそれなりに有効であ る事には変わりないんですが) Strict Session管理パッチ http://d.hatena.ne.jp/masugata/20060202#p2 ↑こんなのもありますけど、ソースからパッチ当ててコンパイルせにゃならんと なると敷居が高く。 要するに 「そのセッションIDは今“アリ”なのか“ナシ”なのか」 さえ解れば良い訳なんですが、どうもPHPのセッション関数にはそうした動作を してくれる関数が見当たらないみたいなんで、 ・クライアントからセッションID渡されたら ・セッションを開始する前に ・/tmpにセッションIDに相当するファイルがあるか調べて ・無ければあらたにセッションを生成する みたいな動作をすれば良いのかなぁ、とか思うんですが、未検証。存在の有無だ けでなくタイプスタンプ等も見たほうが良いのかな? これなら、セッションファイルは所有者apacheの600みたい→file_exists()関数 でなんとかなるような。 # 今は年度末でどうにもならない状態なんですが(^^;) それとも、当方が見つけられないだけでPHPにもそういう関数あるのかなぁ? ホント、有っても全然不思議はないと思うんですがねぇ。 はまだ