こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

セッションハイジャック(セッション固定化)の対策は必要?

・php.ini で session.use_only_cookies = 1
・フレームワークで XSS 対策(自動エスケープ)
を行っている場合、セッションハイジャック(セッション固定化)の
可能性は、ないと考えてよろしいでしょうか?

というのも、session_regenerate_id() は、セッションハイジャックの
可能性を、かなり減らせると思うのですが、これを利用すると、
レスポンスが来る前に、ユーザが送信ボタンを再度クリックしたり
リロードした場合に、セッションが切れてしまうことが
よくあるからです。

そのため、1/5の確立で session_regenerate_id() を起動、
if (mt_rand(1, 5) === 1) {
  session_regenerate_id(TRUE);
}
としてみたのですが、抜本的な対策とは思えません・・・。

XSS対策が完璧で、セッションはクッキーのみの場合、
他にどのような対策が必要でしょうか?ご教示ください。

投稿日時 - 2008-05-29 23:47:01

QNo.4060974

困ってます

質問者が選んだベストアンサー

session nameも変えてみる
とか

あとは、ハイジャックされても問題ない作りをしておく

私が個人的にそういった部分を設計、実装する場合
$_SESSIONには、ワンタイムパスワードのようなものを保存させておく。
と同時にそのパスワードはデータベースに保存させておく

たとえば、会員登録制のサイトを作った場合
ログインをしてもらって操作をするわけですよね
ログイン状態をSESSIONに持たせるってことは、一般的に行われていることですが、あぶなっかしいわけです
データベースのほうに、ログイン関連のテーブルを作っておきます

そのユーザーのログイン状態の情報はデータベースに保存
データベースにはワンタイムパスワードの有効期限を設定しておく
ワンタイムパスワードをSESSIONとデータベースに保存
クリックして別な画面へ遷移するたびにこのワンタイムパスワードが一致しているかどうかを精査する
一致している場合は処理続行でワンタイムパスワードを書き換えてやる
一致しているが有効期限の切れているものは、「○○分操作しないためログアウトしました」画面へ
一致してない場合はSESSIONを破棄して「エラーが発生しました」画面へ
という感じ

他にも、何かを入力してもらってその値を保持する という使い方もするかと思います
その場合も
一時保持するようなテーブルをデータベースに作っておいて、これも同様にワンタイムパスワードをデータベースとSESSIONに保存させて遷移するたびに精査して書き換えてやる
もちろん、有効期限を秒単位や分単位できめてあげても良い。



こうすれば、最悪の場合ハイジャックされてもその情報そのもの(ワンタイムパスワード)は意味の無い情報
しかも、そのパスワードは有効期限以内でなければ全くなんの役にも立たない
10分とか数時間とかなどのように有効時間を決めておけば、有効期限内にハイジャックされるという可能性はきわめて低いと思われます。
しかも、ユーザーが利用中の場合は、遷移するたびにパスワードは刻一刻と変化してゆきますので、ユーザー利用中にハイジャック成功したときにはすでに違うパスワードになっていたりする


別に上記以外の方法でも良いかと思います
要は、COOKIEにせよSESSIONにせよ、外部に漏洩してもなんら問題の無い情報のみを保存させておくことが重要です。


ちなみに、ワンタイムパスワードの生成ロジックも簡単なものにするとパターンを読まれたり、へたすると全く同じものが生成されてしまいますので注意してくださいね。
RAND()関数だけでなんとかしようとすると絶対失敗します。

投稿日時 - 2008-05-30 12:00:34

お礼

ご回答ありがとうございます。

詳細な方法をいただきありがとうございました。
今回は、もう作り込みがほぼ終わっていてリリース間近なので、
大幅な変更はできませんが、近いうちに、上記の方法も考えて、
取り込んでみたいと思います。

ちなみに、
・セッションはクッキーでしか受け付けない
・完全な XSS 対策が施されている
という場合、セッションの漏洩は起こりえるのでしょうか?
(通信の傍受を除く)
この疑問が解けないと、それ以上の対策を施すモチベーションが沸きません。

投稿日時 - 2008-06-08 01:21:22

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

私は、ログイン時に1度だけ regenerate してます。

あと、ログイン時のIPアドレスを保存し、アクセスごとに比較してます。
プロキシなど、IPが変わる場合がありますが、そのときは、再度パスワードを入力してもらい、認証し、OKならそのIPも追加していきます。そんな感じでハイジャック防止してます。
ちょっと手間がかかるので、事前に許可IPを登録してもらえば、楽かも。

携帯向けだと、Cookie使えなかったり頻繁にIP変わったりなどがあるので、もう少し複雑なロジックが必要になるかと思いますが。

投稿日時 - 2008-06-04 07:38:24

お礼

ご回答ありがとうございます。

IPですか。簡単に実装できて、効果の高いのは、やはりIPなんですかね。
ありがとうございました。

投稿日時 - 2008-06-08 01:30:20