0

我们的 asp.net 应用程序存在会话劫持和会话固定问题。我们也实施了 SSL。

1.. 我在 web.config 文件中添加了以下代码。

<----

<httpCookies httpOnlyCookies="true" requireSSL="true"   />


  <forms loginUrl="Homepage.aspx"
      protection="All"
      timeout="20"
      name=".ASPXAUTH"
      path="/"
      requireSSL="true" 
      slidingExpiration="true"
      />

--->

2...加密formsathuntication票并在用户被athunticated后添加到cookie中。

<---

FormsAuthenticationTicket tkt;

字符串cookiestr;

HttpCookie ck;

tkt = new FormsAuthenticationTicket(1, uname, DateTime.Now, DateTime.Now.AddMinutes(20),false, "你的自定义数据");

cookiesstr = FormsAuthentication.Encrypt(tkt);

ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiesstr); ck.Path = FormsAuthentication.FormsCookiePath;

Response.Cookies.Add(ck);

-->

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();

还是问题没有解决。。。

4

1 回答 1

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

详细说明第2点。

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

一个例子:

  1. UserA 登录,他们是管理员用户。他们收到一个 FormsAuth cookie 说明“这是 UserA”,他们可能还会收到一个会话cookie 说明“这个用户是管理员”。
  2. UserB 获取属于 UserA 的会话 cookie 的副本(如果会话 cookie 未清除,他们可能会通过拦截,或者甚至只是在 UserA 注销后位于同一台计算机上来实现​​此目的)。
  3. UserB 登录,他们是“只读”用户(不是管理员)。他们收到一个说明“这是 UserB”的 FormsAuth cookie,然后他们注入在步骤 2 中窃取的会话 cookie。这意味着他们有一个FormsAuth说明“这是 UserB”的Sessioncookie,以及一个说明“此用户是管理员”的 cookie。
  4. Presto,UserB 现在是管理员。

这里的问题(因为它与我最初的关注点列表的第 2 点有关)是服务器没有验证与其会话相关的用户身份。您可以尽最大努力尝试以某种方式将 Session 和 Forms 身份验证票证链接在一起,并确定您正在加密 (SSL)。或者,您可以停止在会话中存储敏感数据(或至少减少它)。当谈到我上面的“此用户是管理员”示例时,更好的实现是将 ASP.NET 角色和配置文件提供程序与成员资格提供程序结合使用。他们三个齐头并进,有很多例子可以说明如何利用它们来发挥自己的优势。

不过,这只是一种可能的调查方式,正如@JohnFx 正确指出的那样,在您期待一个好的答案之前,您确实需要一个集中的问题。在安全实施方面,重要的是要理解所涉及的概念,而不是仅仅在问题上抛出示例代码。到目前为止,您提供的示例代码看起来与讨论会话固定的 CodeProject 文章可疑地相似,但是您了解它要完成的工作吗?您知道它是否甚至适用于您遇到的问题吗?

于 2012-05-22T21:37:05.700 回答