【问题标题】:How to secure the ASP.NET_SessionId cookie?如何保护 ASP.NET_SessionId cookie?
【发布时间】:2011-08-24 03:13:30
【问题描述】:

我已将 .ASPXAUTH cookie 设置为仅 https,但我不确定如何有效地对 ASP.NET_SessionId 执行相同操作。

整个站点使用 HTTPS,因此 cookie 无需同时使用 http 和 https。

【问题讨论】:

标签: c# asp.net session-cookies


【解决方案1】:

也值得考虑:

使用 cookie 前缀

__Secure-, which signals to the browser that the Secure attribute is required.
__Host-, which signals to the browser that both the Path=/ and Secure attributes are required, and at the same time, that the Domain attribute must not be present.

一篇关于为什么会有帮助的好文章

https://check-your-website.server-daten.de/prefix-cookies.html


重命名您的 cookie

而不是使用清楚识别编程语言的名称。

例如

ASP.NET_SessionId = __Secure-SID


使用同站点设置

sameSite="Lax"

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite


使 cookie https 安全

requireSSL="true"


安全示例

<sessionState cookieless="false" cookieName="__Secure-SID" cookieSameSite="Lax" />
<httpCookies httpOnlyCookies="true" sameSite="Lax" requireSSL="true" />

【讨论】:

    【解决方案2】:

    这是取自blog article written by Anubhav Goyal的代码sn-p:

    // this code will mark the forms authentication cookie and the
    // session cookie as Secure.
    if (Response.Cookies.Count > 0)
    {
        foreach (string s in Response.Cookies.AllKeys)
        {
            if (s == FormsAuthentication.FormsCookieName || "asp.net_sessionid".Equals(s, StringComparison.InvariantCultureIgnoreCase))
            {
                 Response.Cookies[s].Secure = true;
            }
        }
    }
    

    将它添加到 global.asax 中的 EndRequest 事件处理程序应该会在所有页面调用中发生这种情况。

    注意:建议进行编辑以在成功的“安全”分配中添加 break; 语句。我拒绝了这个编辑,因为它只允许强制保护 1 个 cookie,而第二个将被忽略。添加计数器或其他一些指标来确定两者都已得到保护并在此时中断并不是不可想象的。

    【讨论】:

    • 完美,谢谢。对于任何阅读本文的人可能会认为它看起来像一个狡猾的解决方法,就像我第一次看到它时所做的那样,我没有找到任何建议有更好的选择,而且这似乎运作良好!
    • 请注意,sessionState cookie 名称可能并不总是ASP.NET_SessionId。可以覆盖msdn.microsoft.com/en-us/library/h6bb9cz9.aspx
    • @EriF89:此功能在 BeginRequest 中没有用。在 EndRequest 中使用时,cookie 集合不应为空(如果它是比保护 cookie 更大的问题)。您的评论确实与主题无关。
    • 会话状态配置文档的更新链接在这里:(奇怪的是 3.0 版本没有存档,但大多数其他版本都存档了)msdn.microsoft.com/en-us/library/h6bb9cz9(v=vs.85).aspx。最重要的是,作为Marcel Hoyer notes in his answer,您应该能够在httpCookies 元素中设置requireSSL="true",这将起作用-您可能需要先清除现有cookie,然后才能看到更改。
    • 绕过循环以支持以某种方式使用索引运算符可能很诱人。但是,在 Response.Cookies 上调用索引运算符实际上会创建一个 cookie,如果该 cookie 尚不存在的话。请注意,根据我的帖子编辑,不可能将安全导航运算符用作分配目标。
    【解决方案3】:

    要将; secure 后缀添加到Set-Cookie http 标头,我只是在web.config 中使用了&lt;httpCookies&gt; 元素:

    <system.web>
      <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
    

    恕我直言,比在 Anubhav Goyal 的文章中编写代码更方便。

    见:http://msdn.microsoft.com/en-us/library/ms228262(v=vs.100).aspx

    【讨论】:

    • msdn.microsoft.com/en-us/library/ms228262(v=vs.100).aspx(此 MSDN 主题目前不适用于 .NET 4.5。)
    • Marcel Hoyer,我尝试了您的方法,但不知何故它不起作用。 asp.net_sessionid 仍然不在 secure 中。您的方法是否适用于 MVC Web 应用程序?
    • @Blaise,我没有为 MVC Web 应用程序尝试这个。还有其他人吗?
    • 我知道这是旧的,但我必须在 MVC4 项目中实现它,而且效果很好。增加了安全;标记到 cookie。
    • 对于那些正确配置 web.config 并且 ASP.NET_SessionId 仍未标记为安全的用户,请务必在再次测试之前清除站点的 cookie。仅仅因为您已注销/未通过身份验证并不意味着您将获得新的会话 cookie。
    【解决方案4】:

    添加到@JoelEtherton 的解决方案以修复新发现的安全漏洞。如果用户请求 HTTP 并被重定向到 HTTPS,则会发生此漏洞,但 sessionid cookie 在第一次请求 HTTP 时被设置为安全。据 McAfee Secure 称,这现在是一个安全漏洞。

    仅当请求使用 HTTPS 时,此代码才会保护 cookie。如果不是 HTTPS,它将使 sessionid cookie 过期。

        // this code will mark the forms authentication cookie and the
        // session cookie as Secure.
        if (Request.IsSecureConnection)
        {
            if (Response.Cookies.Count > 0)
            {
                foreach (string s in Response.Cookies.AllKeys)
                {
                    if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")
                    {
                        Response.Cookies[s].Secure = true;
                    }
                }
            }
        }
        else
        {
            //if not secure, then don't set session cookie
            Response.Cookies["asp.net_sessionid"].Value = string.Empty;
            Response.Cookies["asp.net_sessionid"].Expires = new DateTime(2018, 01, 01);
        }
    

    【讨论】:

      【解决方案5】:

      发现在 Session_Start 中设置安全属性就足够了,正如 MSDN 博客“Securing Session ID: ASP/ASP.NET”中所建议的那样,并进行了一些扩充。

          protected void Session_Start(Object sender, EventArgs e)
          {
              SessionStateSection sessionState = 
       (SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
              string sidCookieName = sessionState.CookieName;
      
              if (Request.Cookies[sidCookieName] != null)
              {
                  HttpCookie sidCookie = Response.Cookies[sidCookieName];
                  sidCookie.Value = Session.SessionID;
                  sidCookie.HttpOnly = true;
                  sidCookie.Secure = true;
                  sidCookie.Path = "/";
              }
          }
      

      【讨论】:

        【解决方案6】:

        使用上述 Marcel 的解决方案来保护表单身份验证 cookie,您还应该更新“身份验证”配置元素以使用 SSL

        <authentication mode="Forms">
           <forms ...  requireSSL="true" />
        </authentication>
        

        其他明智的身份验证cookie不会是https

        见:http://msdn.microsoft.com/en-us/library/vstudio/1d3t3c61(v=vs.100).aspx

        【讨论】:

        • 这样可以保护表单身份验证。只有饼干对吗?假设不保护会话 cookie,这是这里的实际问题。
        【解决方案7】:

        如果整个站点都使用 HTTPS,那么您的 sessionId cookie 至少与 HTTPS 加密一样安全。这是因为 cookie 是作为 HTTP 标头发送的,而当使用 SSL 时,HTTP 标头在传输时会使用 SSL 进行加密。

        【讨论】:

        • 请记住,如果用户将 URL 键入浏览器“www.securesite.com”,则对该服务器的初始请求(包括任何 cookie)将是不安全的;服务器可能会响应重定向到 SSL 站点,之后您是正确的。
        • 这是有道理的,但不幸的是,我们的客户使用的测试人员不这么看:)
        • “HTTP 标头在传输时使用 SSL 加密”这是表示通道已加密还是实际 cookie 内容已加密?
        • 只有在 HTTP 访问被拒绝或重定向时才适用。即使是这种情况,设置 cookie 也是一种额外的故障保护。
        • @Spongeboy 实际上在这些情况下甚至都不是真的。如果有中间人,在服务器返回重定向状态代码之前,他们已经拥有 cookie 的副本。
        猜你喜欢
        • 1970-01-01
        • 2019-07-13
        • 2017-01-30
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        • 2012-05-03
        相关资源
        最近更新 更多