我有一个需要用户名和密码的应用程序。当用户单击注销按钮时,它将运行:
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和会话信息?
答案 0 :(得分:4)
根据MSDN(http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.signout.aspx),
调用SignOut方法只会删除表单身份验证Cookie。 Web服务器不存储有效和过期的身份验证票证以供以后进行比较。如果恶意用户获得有效的表单身份验证cookie,这会使您的站点容易受到重播攻击。
他们提供了三种方法来缓解这种风险。只有最后一种方法(使用持久存储来自己跟踪登录状态)将阻止实际用户重放请求。第一种方法只是缩短了漏洞的时间窗口,第二种方法使cookie不受第三方的影响。