2

ASP.NET MVC ユーザーのシステムを使用する代わりに、次のように単純にセッションを使用しています。

彼がログインすると (ユーザー名 + パスワード)、対応するユーザーをデータベースから取得して、次のように設定します。

Session["UserId"] = fetchedUser.UserId;

次に、彼がログインしているかどうかを常に確認しています。

if (Session["UserId"] != null && ...)

問題は、誰かがログインしたユーザーから ASP.NET_SessionId の値をコピーした場合 (例:ユーザーがトイレに行き、隣に座っている同僚が chrome inspector で自分の Cookie をチェックしている場合)、そのユーザーは Cookie を作成できることです。彼のコンピューターで、そのユーザーとして行動します。

Chrome のインスペクター

私の質問は次のとおりです。

  1. セッション ID が Cookie に保存されている場合、セッションが Cookie よりも安全なのはなぜですか?
  2. これをより安全にすることはできますか (そして、引き続きセッションを使用できますか)?
  3. 内部的に ASP.NET ユーザー認証システムはどのようにそれを行うのですか?
4

1 に答える 1

8

Session を認証メカニズムとして使用しない主な理由は、アプリケーションがSession Fixationに対して脆弱になる可能性があるためです。たとえば、ユーザーが HTTP プロトコルを使用してサイトにアクセスし、ASP.NET_SessionIdCookie に保存されているセッション ID を受け取った場合に問題が発生する可能性があります。ユーザーは後でログインする可能性があり、ログイン ページが HTTPS で保護されている場合でも、セッション トークンは HTTP で既に生成されています。つまり、セッション トークンはクリアテキストを使用して既に転送されています。

他の点に答えるには:

セッション ID が Cookie に保存されている場合、セッションが Cookie よりも安全なのはなぜですか?

セッションに保存されるデータはサーバー側に保存されるため、攻撃者がこのデータを改ざんすることはより困難です。すべての Cookie ストアは、データ自体ではなく、このデータのトークンです。FormsAuthenticationProviderそうは言っても、上記のようにセッションの固定を回避する理由から、セッションの開始時ではなく、ログインが完了すると新しい認証トークンが作成されるため、 を使用する方が安全です。

これをより安全にすることはできますか (そして、引き続きセッションを使用できますか)? 内部的に ASP.NET ユーザー認証システムはどのようにそれを行うのですか?

組み込みのプロバイダーはすでに目的に適合しているため、要件を満たすために別のメカニズムをごまかすのではなく、それを使用することをお勧めします。また、拡張性にも優れているため、必要に応じてカスタマイズできます。ASP.NET ユーザー認証は、暗号化されたチケットを作成し、サーバー側の変数への参照を保存するのではなく、Cookie に保存します: http://support.microsoft.com/kb/910443

また、サインアウト メカニズムとそれを保護する方法にも注目してください。特に

SignOut メソッドを呼び出すと、フォーム認証 Cookie のみが削除されます。Web サーバーは、後で比較するために、有効な認証チケットと期限切れの認証チケットを保存しません。これにより、悪意のあるユーザーが有効なフォーム認証 Cookie を取得した場合、サイトはリプレイ攻撃に対して脆弱になります。

詳細はこちら: http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.signout.aspx

さらに、ASP 認証 Cookieに"secure" フラグを設定して、MITM 攻撃者による HTTP 経由での漏洩を防ぐことができます。

于 2013-08-06T10:20:05.430 に答える