如何保护ASP.NET_SessionId cookie?

时间:2011-05-12 13:26:29

标签: c# asp.net session-cookies

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

整个网站都使用HTTPS,因此cookie无需使用http和https。

7 个答案:

答案 0 :(得分:133)

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

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

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

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

答案 1 :(得分:43)

以下是取自blog article written by 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;语句。我已经拒绝了这个编辑,因为它只允许1个cookie被强制保护而第二个被忽略。添加计数器或其他度量标准以确定两者都已被保护并在此时断开是不可想象的。但是,使用更新的代码技术,这可能更好地写为:

Response.Cookies[FormsAuthentication.FormsCookieName]?.Secure = true;
Response.Cookies["asp.net_sessionid"]?.Secure = true;

答案 2 :(得分:13)

使用上面的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

答案 3 :(得分:7)

发现在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 = "/";
        }
    }

答案 4 :(得分:0)

添加@ 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);
    }

答案 5 :(得分:0)

也值得考虑:

使用 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" />

答案 6 :(得分:-2)

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