web-dev-qa-db-ja.com

セッションハイジャック-セッションIDを再生成する

各リクエストでセッションIDを再生成することで、セッションハイジャックの可能性が軽減され、実装する価値がありますか?

セッション変数に保存されているREMOTE_ADDRとREMOTE_ADDRのチェックを組み合わせて、30分の非アクティブタイムアウトと、絶え間なく変化するセッションIDを組み合わせて、リスクを許容レベルに緩和すると思います。

さらに、セッションIDの再生成に関して他の懸念事項はありますか?新しい再生のたびに古いセッションを明示的に破棄する必要がありますか?

最後に、すべてのリクエストでセッションIDを再生成すると、大規模な展開でリソースを集中的に使用しすぎて、セキュリティ上の利点を正当化できないのでしょうか。

17
Purge

このアプローチを試して実装を実装したところ、Webファーム全体でリソースの問題や競合状態が発生する可能性があるため、実装を試みました。最初は良い考えのように聞こえますが、再生成プロセスの暗号が多すぎる場合は、アプリケーションがサービス拒否攻撃を受けやすくなる可能性もあります。定期的にセッションIDを事前に生成してキャッシュを使用可能にしておく必要がありますが、キャッシュを安全に管理する必要があります。

セッションID変数を保護するためのいくつかのより一般的なソリューションは、

  • sSLを使用する
  • 認証されたセッションIDのみを生成 SSL経由のログイン成功、そうでない場合はセッション固定に対して脆弱になる
  • 暗号的にランダムで推測できないトークンを生成する
  • セッションIDを頻繁に期限切れにする
  • 適切に期限切れになり、ログアウト時にサーバー側に
  • セッションID CookieをHttpOnlyおよび「安全」としてマーク
12
Weber

この全体をどのように実装するかによって異なると思いますが、可能性としては、変化するセッションIDを追跡するランタイムのホストの問題が発生する可能性があります。

それが役立つだろう?あんまり。 REMOTE_ADDRを偽装し、変更前にセッションIDをキャッチするのは非常に簡単です。ユーザーが別のリクエストを行う前にキャッチして使用します。

より良いアイデアは、Cookieの値を暗号化し、HTTPS経由でのみ接続し、Cookieの有効期間を非常に短いものに設定する/セッションの有効期間を非常に短いものに設定し、CookieをHttpOnlyに設定することです(JavaScriptからはアクセスできません-一部のみ)ただし、新しいブラウザの場合)、そして最後に、フレームワークセッション管理を使用します-自分でロールバックしないでください。 :)

4
Steve

もちろん、セッションの有効期限が切れており、トークンが信頼できるものであり、ランダムに生成されていることを確認してください。

ただし、これらすべての回答から、私はSSLを使用することが最大のポイントだと思いますが、セッション全体に対してです。

SSL経由でログインし、それ以降は通常のhttpを使用し、後続の各リクエストからセッションを再生成し、上記のすべての優れた機能を実行しても、ユーザーのセッションが何らかの方法でハイジャックされないことを保証する方法はありません。セッション全体を転送することで、盗聴や乗っ取り(SSLの目的)を確実に防止する必要があります。

NAT化されたファイアウォールに関しては、リモートアドレスの使用もかなり重要です。

次に、特定のクライアントのマシンがログインできる唯一のマシンであることを確認するためにさらに一歩進める必要がある場合、ユーザーがブラウザにロードするクライアント証明書を発行し、サーバーはSSLネゴシエーション中にこれを要求します。 。

1
Troy Rose

一般的な使用法で私が見た中で最高のものは、安全なログインの後にセッション識別子を再生成し、その識別子をクライアントマシンに関連付けます。アプリケーションのセキュリティラッパーは、同時ログインをチェックします(古いログインが終了してIDが期限切れになるまで新しいログインを許可しません)。ブラウザを閉じるかログアウトするとIDが期限切れになり、有効期限もかなり短い(10分)

他のセキュリティ機能と組み合わせて、システムに過負荷をかけることなく、目的(オンラインコンシューマーバンキングアプリケーション)に適していました。

0
Rory Alsop