0

セッションのハイジャックを防ぐために、セッションがロードされるたびにセキュリティ ハッシュを再生成する PHP のセッション管理クラスがあります。最近、IE 10 を使用しているユーザーがログアウトし続けるという苦情に遭遇しました。私はこの問題を IE10 + 不明なアドオンで発生する可能性のある問題にまでさかのぼり、ページの読み込みごとにユーザー エージェントがわずかに変化する原因となっている可能性を突き止めました。再現できないため、これが実際に起こっているという証拠はありませんが、ブラウザのユーザーエージェント文字列で1文字でも変更すると無効なセキュリティハッシュが生成され、ログアウトします。

私の質問は簡単です。上記が正しいと仮定すると、ユーザー エージェントの代わりに使用する他の値は何ですか。これは、ユーザー間で異なる可能性が高いある種の定数文字列である必要があり、ユーザーが提供する必要があります。最初は、データベースからユーザーのパスワードのハッシュ化されたバージョンを使用するつもりでしたが、ユーザーによって提供されたものではないため、ハイジャックの試みが発生した場合でも「正しい」ままになるため、これは良くないことに気付きました。

ローカル ネットワークの設定によっては、ブラウジング セッション中にユーザーの IP が変わる可能性があるため、IP が悪いことはわかっています。X-Forwarded-For信頼できるかどうかはよくわかりませんが、そうではないことがわかります。

おそらく最良の解決策は、より高いレベルのブラウザー検出をセットアップしてから、短縮されたブラウザー名を使用して、UA 文字列のわずかな変化がハッシュで使用される文字列に影響を与えないようにすることです...

とにかく、私はこれについていくつかの洞察を得ることを望んでいます.

4

1 に答える 1

0

PHP get_browser()を見て、ユーザーエージェントへのわずかな警告がセッションを中断しないように、この関数から派生した文字列を使用するのが最善であると判断しました。

// get browser data
$browser = get_browser();

// create security hash
// Other stuff is done here that I omitted from this post for security reasons :)
$_SESSION["security_hash"] = sha1($static_key . $dynamic_key . $browser->platform . $browser->browser . $browser->version);
于 2013-04-23T19:54:09.253 に答える