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

shinichiro mori shinichiro.mori.1983 @ gmail.com
2010年 8月 21日 (土) 19:41:25 JST


森です。林さん、コメントありがとうございます。

> 僕の言っている認証は「そのリクエストがセッションを維持できる条件に合致し
> ている事の評価」ですので、いわゆるパスワード認証などとは別のものです。

> セッションハイジャックは「複数のリクエスト中維持されるデータ」を盗用する
> 事にありますので、盗用されているかどうかをリクエスト毎に評価する必要があ
> ります。

> この評価をさして僕は”認証”と表現しました。
> ちょっとわかりにくいかもしれませんが、タイムアウトも広義には認証です。要
> するにエンドユーザーの受動的行動に限らず、正当性評価の手法として認証があ
> ると考えてもらった方がわかりやすいかもしれません。

タイムアウトによって、再度ログインを促すような処理は、たとえ正規の
ユーザーであっても、一定時間を経過すればセッションをリセットすることで、
より安全にするための方法かと思いました。
現時点では、IPアドレスやユーザーエージェント等のチェックも、正当性評価の
ためのチェック項目として利用できるという理解です。

更に別の角度からもチェックしなければ、正当性の評価としては不十分でしょうか?
セッションクッキーとは別にクッキーを用意し、そのクッキーと $_SESSIONに
ワンタイム・トークンのようなデータをセットしておき、毎回照合する、等
考えてみたのですが、他にありましたら、教えてもらえますか?
※言われているポイントを私がまだ理解していない可能性もあります。


いろいろな方からのコメントを踏まえ、現時点では概ね次のように考えています。

■ログイン時の処理
・ユーザーID、IPアドレス、ユーザーエージェント等、ユーザーを識別する
 ための情報を $_SESSION にセットする。

■ログイン後、リクエスト毎の処理
・ログイン時に $_SESSION にセットされたはずの情報がセット
 されてない場合はセッションを破棄する。
・$_SESSION と $_SERVER の情報(IP 等)を比較し、異なった場合は
 セッションを破棄する。
・タイムアウト処理: 正規ユーザーであっても一定時間経過すれば再度
 ログインしてもらう。また、共有PC 等で、IP アドレス等による判定が
 不可能な場合でも、ある程度安全が確保できると思われる。ただし、
 あまり短いとやや利便性が損なわれるので、検討中。
・セッションID の再セット: session_regenerate_id(true)。

■その他
・重要な処理に関しては、その都度パスワードを入力してもらう。


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