如何保护ASP.NET_SessionId cookie?


Answers:


49

这是从Anubhav Goyal撰写博客文章中摘录的代码片段:

// 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;在成功的“安全”分配内添加一条语句。我拒绝此编辑是基于这样的想法,即只允许其中一个cookie被强制保护,而第二个则被忽略。添加计数器或其他度量来确定两者均已固定并在该时间点中断是不可想象的。


5
太好了,谢谢。对于任何阅读此书的人来说,就像我初次看到它时一样,它看起来似乎是一个狡猾的解决方法,我还没有发现任何建议可以找到更好的选择,而且这似乎很好!
皮特

1
请注意,sessionState cookie名称可能并不总是ASP.NET_SessionId。可以覆盖msdn.microsoft.com/en-us/library/h6bb9cz9.aspx
kenwarner 2011年

1
@ EriF89:此功能在BeginRequest中没有用。当在EndRequest中使用时,cookie集合不应为空(如果它比保护cookie有更大的问题)。您的评论确实与该主题无关。
乔尔·埃瑟顿

1
这需要引用system.web.security。也是受Application_EndRequest事件处理程序(或类似的处理程序)保护的无效void Application_EndRequest(object sender,EventArgs e){etc ...
nuander

2
链接到会话状态配置文档的更新链接位于此处((3.0版本很少存档,但其他大多数版本则未存档)msdn.microsoft.com/zh-cn/library/h6bb9cz9(v=vs.85 ) .aspx。最重要的是,正如Marcel Hoyer在回答中指出的那样,您应该可以requireSSL="true"httpCookies元素中进行设置,并且该设置将起作用-您可能需要先清除现有的Cookie,然后才能看到更改。
Zhaph-Ben Duguid

168

要将; secure后缀添加到Set-Cookiehttp标头中,我仅使用<httpCookies>了web.config中的元素:

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

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

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



9
Marcel Hoyer,我尝试了您的方法,但是以某种方式无法正常工作。该asp.net_sessionid还在不在secure。您的方法适用于MVC Web应用程序吗?
布莱斯

@Blaise,我没有在MVC Web应用程序上尝试过此操作。还有其他人吗
Marcel Hoyer

2
我知道这很旧,但是我必须在MVC4项目中实现它,并且效果很好。增加了安全性;标记到cookie。
puddinman13 2014年

13
对于正确配置web.config且ASP.NET_SessionId仍未标记为安全的用户,请确保在再次测试之前清除站点的cookie。仅仅因为您已注销/未通过身份验证并不意味着您将获得新的会话cookie。
亚当·卡维尼斯

16

使用上面的Marcel解决方案来保护Forms Authentication cookie时,您还应该更新“ authentication”配置元素以使用SSL

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

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

请参阅:http : //msdn.microsoft.com/zh-cn/library/vstudio/1d3t3c61(v=vs.100).aspx


2
这样可以保护表单验证。Cookie才对吗?不应该保护会话cookie,这是这里的实际问题。
Rahatur

9

发现在Session_Start中设置安全属性已足够,如MSDN博客“保护会话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 = "/";
        }
    }

2

添加到@JoelEtherton的解决方案中以修复新发现的安全漏洞。如果用户请求HTTP并将其重定向到HTTPS,但是在首次请求HTTP时将sessionid cookie设置为安全,则会发生此漏洞。据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);
    }

-3

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


15
请记住,如果用户在浏览器“ www.securesite.com”中键入URL,则对该服务器的初始请求(包括任何cookie)将是不安全的;服务器可能会以重定向到SSL站点的方式响应,此后您是正确的。
克里斯·谢弗

3
这是有道理的,但不幸的是,我们的客户使用的测试人员没有那样看:)
皮特

“ HTTP头在传输时使用SSL进行了加密”,这是否意味着通道已加密或实际的cookie内容已加密?
拉里·希普

2
仅当拒绝或重定向HTTP访问时才如此。即使是这种情况,设置cookie也是一种附加的故障保护。
Spongeboy

4
@Spongeboy实际上,在这些情况下甚至都不是。如果有中间人,则在服务器返回重定向状态代码之前,他们已经有cookie的副本。
理查德·萨雷
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.