3

ユーザー名とパスワードが必要なアプリケーションがあります。ユーザーがログアウト ボタンをクリックすると、以下が実行されます。

private void LogOut()
{
    Session["SessionName"] = null;
    Session.Remove("SessionName");
    System.Web.Security.FormsAuthentication.SignOut();

    Response.Cookies.Remove("AuthCookie");
    HttpCookie c = new HttpCookie("AuthCookie");
    c.Expires = DateTime.Now.AddYears(-1);
    Response.Cookies.Add(c);

    Session.Clear();
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
    Response.Cache.SetNoStore();
    Response.Cache.SetNoServerCaching();

    Session.Abandon();

    Response.Redirect("~/user/login.aspx");
}

問題は、セキュリティをテストするときです。データベース内のデータを変更するページに移動すると、Fiddlerを使用してこの要求を「記録」できます。 アプリケーションからログアウトした後も、まだログインしている場合と同じように、Fiddler でこの要求を再生できます。実際、コードを中断しても、すべての Cookie とセッション情報を表示できます。セッションが (タイムアウトにより) 期限切れになった後にのみ、実際のセッションはなくなります。

Cookie の有効期限が切れてセッションを中止した後も、この情報を確認できるのはなぜですか? ユーザーがログアウト ボタンをクリックしたときに、Cookie とセッション情報を完全に消去するにはどうすればよいですか?

4

1 に答える 1

4

MSDN ( http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.signout.aspx ) によると、

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

彼らは、このリスクを軽減する 3 つの方法を示しています。最後の方法 (永続ストレージを使用して自分でログイン ステータスを追跡する) のみが、実際のユーザーが要求を再生するのを防ぎます。最初の方法は、脆弱性の時間枠を短縮するだけであり、2 番目の方法は、Cookie をサード パーティから保護します。

于 2013-05-28T22:01:26.170 に答える