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,这会使您的站点容易受到重放攻击。

他们给出了三种减轻这种风险的方法。只有最后一种方法(使用持久存储自己跟踪登录状态)会阻止实际用户重播请求。第一种方法只是减少了漏洞的时间窗口,第二种方法使 cookie 不受第三方的影响。

于 2013-05-28T22:01:26.170 回答