[Tep-j-general] Re: IE6だけログインできない

Back to archive index

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にもそういう関数あるのかなぁ?
ホント、有っても全然不思議はないと思うんですがねぇ。


はまだ




Tep-j-general メーリングリストの案内
Back to archive index