[PHP-users 35330] Re: セッションハイジャックと session_regenerate_id() について

shinichiro mori shinichiro.mori.1983 @ gmail.com
2010年 8月 11日 (水) 00:23:57 JST


コメントありがとうございます。

session_regenerate_id() は、最初に投稿したメールの「■検証手順」で提示したような
セッションID が盗まれるケースのためというより、セッション固定攻撃の対策として有用であると
いうことですね。
ネットワークをモニターしている攻撃者への対策としては、やはり SSL の導入ということになりますね。

個人的な事情ですが、現在利用しているレンタルサーバでは SSL が使えないという事情があり、
一応そのことも踏まえた上で考えを進めていました(この点も最初から書けばよかったです)。


>> もしくは、セッション変数をチェックして、内容が不正と判断される時のみ session_regenerate_id() を
>> 使用する等、至るところで不用意に使用しない方が良いということでしょうか?
>
> ここが良く分からないのですが、内容が不正かどうかをどのようにして
> 判断するのでしょうか?
>
> 確かに、セッション変数に攻撃者が変更できない情報(IP アドレスなど)を
> 保持して、毎回チェックするという手段はあります。ただ、アクセスごとに
> こうした情報が変化する場合もあり、限定された環境でないと、この方法は
> 使用できません。
> このため、内容が不正かどうかをチェックする万能な方法は無いように
> 思います。

不正かどうかの判断についてですが、正式なログイン処理を経て送信されたセッションID であれば、
会員ID などのキーと値の組を保持しているはずなので、セッションが初期化された時点でそれらを
チェックして、保持していなければ不正であると判断できる、という意味で書きました。

おっしゃるように、IP アドレスなどの変化しうる情報であれば、会員であっても不正の判断が難しく、
また、SSL を導入している前提だとしても、ブラウザの情報を覗かれてセッションID が盗まれたという
ケースを考えるならば、保持している会員ID が正しくても不正の判断ができませんね。
自分で考慮しないと書きましたが、セッション固定攻撃のケースならば、上記の方法で判断できると思いますが。

> また、session.gc_maxlifetime の設定による時間経過よりも前に
> 攻撃者がアクセスすると、セッションを継続させることができます。
> このため、セッションハイジャックされた場合のタイムアウトに
> よるセッション破棄は期待しない方が良いと思います。

この点については勉強不足で、セッションファイルは初期化されるごとにファイル更新時刻が更新されていく
ということを知りませんでした。


PHP-users メーリングリストの案内