2013-04-17 22 views
5

ASP.NET Webサイトフォーム認証でCookieリプレイ攻撃について質問されています。フォーム認証 - Cookieリプレイ攻撃 - 保護

私は、任意の攻撃から保護するために、以下のアドバイスに従ったが、誰かが(短時間だけとはいえ)クッキーで取得するために管理している場合、サイトはまだ脆弱であると考えています。アドバイスが続く悪意を持って誰かがクッキーを盗まれた場合でも、それを使用するチャンスはないだろうように、完全にログアウト時にフォーム認証セッションを破壊するが道

は、我々は、我々はすべての責任を負うの措置を講じていると信じて

だっれます私たちはこれをASP.NETの枠内で保護することができます。下記の詳細な回答をご覧ください。

しかし、我々は(http://support.microsoft.com/default.aspx?scid=kb;en-us;900111を参照)

・認証Cookie

は、それが難しい盗むために行ったクライアント・マシンに書き込まれることはありません。この身を守るためにマイクロソフトからの推奨手順を実施しています。

は・アプリケーションが実行可能なさそうクッキーが非セキュアな接続を介して発行されることはありませんSSL経由

・私たちは、すべての問題のクッキーがそのタイムリミット

後に無用であることを意味する15分のタイムアウトと絶対有効期限を強制

・httpOnly Cookieを使用することで、このCookieを文法上傍受したり変更したりすることはできません。

したがって、上記の注意事項が壊れた場合でも、我々は非常に低いと思われ、悪意のあるユーザーは完全に破壊する方法はあり

+0

HSTSを使用していて、Cookieに 'secure'フラグを設定していますか? – CodesInChaos

答えて

6

シンプルなアイデアは、ランダムなGUIDを生成し、クッキーのユーザデータセクション内に格納することです。次に、ユーザーがログアウトすると、ユーザーデータからGUIDを取得し、この「セッション」が終了した注釈とともにサーバー側のリポジトリに書き込みます。

次に、リクエストごとに、クッキーのuserdataセクションからのguidが終了セッションを指していないかどうかをチェックするhttpモジュールを用意してください。 「はい」の場合は、期限切れのCookieが再利用されたという警告で要求を終了します。

これには、リクエストごとに追加のルックアップが必要です。

+3

追加コストは、このアプローチがうまく拡張されないことです。頻繁に使用されるWebアプリケーションでは、すぐにGUIDでいっぱいの巨大なテーブルが作成されるためです。現在のセッションのGUIDをデータベースのユーザー行に格納し、ユーザーがログアウトするとNULLに設定する方が良いでしょうか?このようにして、格納するGUIDの最大数は<ユーザー数>になります。 – thomaskonrad

+1

@ to0om:これは、同じユーザーが複数のアクティブな独立したセッション(たとえば、異なるブラウザ)を持ち、他のセッションを終了せずにそれらのセッションを終了すると、 –

+0

そうです。複数の同時セッションをサポートしたい場合は、1対多の関係を持つ別のセッションGUIDテーブルで問題を解決できます。私は、期限切れのGUIDを保存するという考えが嫌いです。これを真剣に受け止めてしまうと、あとで古いセッションを再び有効にしないために永遠に保存する必要があるからです。アクティブなGUIDを格納すると、10同時セッションの可能性のある制限と組み合わせて、格納する必要があるGUIDの最大数が制限されます。 – thomaskonrad

3

にログインに成功注意事項を破るとする15分間のウィンドウを持っているでしょう誰かがクッキーを盗まれた場合でも、フォーム認証セッション はログアウト時に、悪意を持って

方法は、ユーザがログアウトして何時間され、サーバー上のトラックを維持することです、それを使用することのないチャンス はないだろうように、そのようになっても有効な認証Cookieを使用してページを表示するには、このユーザーがサーバーレコードにも記録されているかどうかを再度確認します。

これは、あなたが維持し、認証Cookieのユーザーのステータスのログインログアウトとされていない100%・カウントをチェックするために、データベース上の余分なテーブルを持っていなければならないことを意味します。

完全にクッキーが盗まれていることを最悪のシナリオでは

ログアウト

に、あなたが実際にすることはできません、フォーム認証セッション を破壊する方法はあります。

はなぜ、フォーム認証が実際にクッキーの上のすべてのデータを保持しているため(のようになど、ユーザーが誰であるか、有効期限が切れているとき)、ということです。だからあなたはそれを削除することはできませんし、クッキーにあります、そして、代わりにそれをサーバ上のあなたのカスタムデータと同期させ、余分なレベルのセキュリティを持たせることです。

関連:Can some hacker steal the cookie from a user and login with that name on a web site?

+0

Cookieのユーザーデータセクションを使用して、フォームCookieとサーバー側の永続情報を関連付けるために使用できる追加情報を格納できます。したがって、セッションが終了した後にCookieが再利用されるかどうかを実際に検出することができます。 –

+0

@WiktorZychlaしかし、ハッカーがセッションCookieとログインしたCookieの両方を取得して置き換えるのであれば?その後、あなたの小切手を渡します。 – Aristos

+0

セッションデータにguidを持つ暗号化されたフォームクッキーが1つあります。このGUIDはサーバー側のセッションに対応するのではなく、追加の一意のガーディングトークンに過ぎません。 –

0

私は認証された最初のリクエストで認証CookieにSessionIDを格納し、アクティブなSessionIDが後続のリクエストのCookieと一致することを確認するシステムを実装しました。 Details on this answer.これは、@ WiktorZychlaの答えに示唆されたサーバー側の追跡を回避しました。

これはおそらく、SessionIDではなく、受信したIP + Request.Browser + SessionIDのハッシュをセッションと認証Cookieに格納することで改善する可能性があります。

関連する問題