会话劫持和会话固定

时间:2012-05-22 19:53:23

标签: asp.net session

我们的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();

仍然没有解决问题...

1 个答案:

答案 0 :(得分:1)

  1. 您的问题会话是否遭到劫持,或身份验证劫持?
  2. 您是否在不验证身份的情况下信任会话值? (请注意,会话和身份验证在ASP.NET中不是内在链接的。)
  3. 如果您已实施SSL,为什么您的会话Cookie仍设置为requireSSL="false"
  4. 研究最佳实践,亲眼看看你哪里出错了。例如 - http://www.troyhunt.com/2010/07/owasp-top-10-for-net-developers-part-3.html
  5. 详细说明第2点。

    此处使用了两个Cookie,一个用于Session,另一个用于FormsAuthentication。 FormsAuth cookie标识用户,并且需要采取所有合理的步骤来保证用户安全。通常,需要SSL是一个很好的步骤(正如您在编辑示例时所应用的那样)。虽然会话cookie通常不会受到开发人员的密切关注,但取决于你如何使用它可能同样敏感。 会话固定会窃取会话,身份验证。

    一个例子:

    1. UserA登录,他们是管理员用户。他们收到一个说明“这是UserA”的FormsAuth cookie,他们可能还会得到一个会话 cookie,说明“此用户是管理员”。
    2. UserB获取属于UserA的会话cookie的副本(他们可能通过拦截执行此操作,或者甚至只是在UserA注销后如果未清除会话cookie而在同一台机器上执行此操作)。
    3. UserB登录,他们是“只读”用户(不是管理员)。他们收到一个说明“这是UserB”的FormsAuth cookie,然后注入在步骤2中被盗的会话cookie。这意味着他们有一个FormsAuth cookie表明“这是UserB”,并且{ {1}} Cookie说明“此用户是管理员”。
    4. Presto,UserB现在是管理员。
    5. 此处的问题(因为它涉及我原始关注列表的第2点)是服务器未验证与其会话相关的用户身份。您可以尽力尝试以某种方式将Session和Forms身份验证票证链接在一起,并确保确定您正在加密(SSL)。或者,您可以停止在会话中存储敏感数据(或至少减少它)。对于上面的“此用户是管理员”示例,更好的实现是将ASP.NET角色和配置文件提供程序与成员资格提供程序结合使用。其中三个是齐头并进的,并且有很多关于如何利用它们的例子的很多

      这只是一个可能的调查线,正如@JohnFx正确指出的那样,你真的需要一个专注的问题,然后才能得到一个好的答案。在安全实现方面,理解所涉及的概念非常重要,而不仅仅是在问题上抛出示例代码。到目前为止,您提供的示例代码看起来非常类似于讨论会话固定的CodeProject文章,但您是否了解它正在尝试完成的内容?你知道它是否适用于你遇到的问题吗?