我们的asp.net应用程序遇到了Session劫持和Session固定问题。 我们也实施了SSL。
1 ..我在web.config文件中添加了以下代码。
< ----
<httpCookies httpOnlyCookies="true" requireSSL="true" />
<forms loginUrl="Homepage.aspx"
protection="All"
timeout="20"
name=".ASPXAUTH"
path="/"
requireSSL="true"
slidingExpiration="true"
/>
---&GT;
2 ...加密formathuntication票证并在用户被取消后添加到cookie中。
&LT; ---
FormsAuthenticationTicket tkt;
string cookiestr;
HttpCookie ck;
tkt = new FormsAuthenticationTicket(1,uname,DateTime.Now,DateTime.Now.AddMinutes(20),false,“您的自定义数据”);
cookiestr = FormsAuthentication.Encrypt(tkt);
ck = new HttpCookie(FormsAuthentication.FormsCookieName,cookiestr); ck.Path = FormsAuthentication.FormsCookiePath;
Response.Cookies.Add(CK);
- &GT;
3 ..我正在删除会话变量并在注销页面和错误页面上将空值传递给ASP.NET_SessionID。
SessionHandler.EndSession();
Session.RemoveAll();
Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
if (Request.Cookies["ASP.NET_SessionId"] != null)
{
Response.Cookies["ASP.NET_SessionId"].Value = string.Empty;
Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(-20);
}
if (Request.Cookies["AuthToken"] != null)
{
Response.Cookies["AuthToken"].Value = string.Empty;
Response.Cookies["AuthToken"].Expires = DateTime.Now.AddMonths(-20);
}
HttpCookie authcookie = Request.Cookies[FormsAuthentication.FormsCookieName];
authcookie.Expires = DateTime.Now.AddDays(-1D);
Response.Cookies.Add(authcookie);
FormsAuthentication.SignOut();
仍然没有解决问题...
答案 0 :(得分:1)
requireSSL="false"
?详细说明第2点。
此处使用了两个Cookie,一个用于Session
,另一个用于FormsAuthentication
。
FormsAuth cookie标识用户,并且需要采取所有合理的步骤来保证用户安全。通常,需要SSL是一个很好的步骤(正如您在编辑示例时所应用的那样)。虽然会话cookie通常不会受到开发人员的密切关注,但取决于你如何使用它可能同样敏感。 会话固定会窃取会话,不身份验证。
一个例子:
FormsAuth
cookie表明“这是UserB”,并且{ {1}} Cookie说明“此用户是管理员”。此处的问题(因为它涉及我原始关注列表的第2点)是服务器未验证与其会话相关的用户身份。您可以尽力尝试以某种方式将Session和Forms身份验证票证链接在一起,并确保确定您正在加密(SSL)。或者,您可以停止在会话中存储敏感数据(或至少减少它)。对于上面的“此用户是管理员”示例,更好的实现是将ASP.NET角色和配置文件提供程序与成员资格提供程序结合使用。其中三个是齐头并进的,并且有很多关于如何利用它们的例子的很多。
这只是一个可能的调查线,正如@JohnFx正确指出的那样,你真的需要一个专注的问题,然后才能得到一个好的答案。在安全实现方面,理解所涉及的概念非常重要,而不仅仅是在问题上抛出示例代码。到目前为止,您提供的示例代码看起来非常类似于讨论会话固定的CodeProject文章,但您是否了解它正在尝试完成的内容?你知道它是否适用于你遇到的问题吗?