Wie sichere ich das Cookie ASP.NET_SessionId?

73

Ich habe das .ASPXAUTH-Cookie auf "nur https" gesetzt, bin mir jedoch nicht sicher, wie ich dasselbe mit der ASP.NET_SessionId effektiv tun soll.

Die gesamte Site verwendet HTTPS, sodass das Cookie nicht sowohl mit http als auch mit https funktionieren muss.

Pete
quelle

Antworten:

49

Hier ist ein Code-Ausschnitt aus einem Blog-Artikel von 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;
        }
    }
}

Wenn Sie dies dem EndRequest-Ereignishandler in der Datei global.asax hinzufügen, sollte dies für alle Seitenaufrufe möglich sein.

Hinweis: Es wurde eine Bearbeitung vorgeschlagen, um eine break;Anweisung in eine erfolgreiche "sichere" Zuweisung einzufügen. Ich habe diese Änderung aufgrund der Idee abgelehnt, dass nur eines der Cookies zum Sichern gezwungen werden kann und das zweite ignoriert wird. Es ist nicht unvorstellbar, einen Zähler oder eine andere Metrik hinzuzufügen, um festzustellen, ob beide gesichert wurden, und um an diesem Punkt zu brechen.

Joel Etherton
quelle
5
Perfekt, danke. Für alle, die dies lesen und denken, dass es wie eine zwielichtige Umgehung aussieht, wie ich es getan habe, als ich es zum ersten Mal gesehen habe, habe ich nichts gefunden, was darauf hindeutet, dass es eine bessere Option gibt, und dies scheint gut zu funktionieren!
Pete
1
Beachten Sie, dass der Name des sessionState-Cookies möglicherweise nicht immer lautet ASP.NET_SessionId. Es kann überschrieben werden msdn.microsoft.com/en-us/library/h6bb9cz9.aspx
Kenwarner
1
@ EriF89: Diese Funktionalität ist in BeginRequest nicht nützlich. Bei Verwendung in EndRequest sollte die Cookiesammlung nicht leer sein (wenn Sie größere Probleme haben als das Sichern eines Cookies). Ihr Kommentar hat wirklich keinen Einfluss auf das Thema.
Joel Etherton
1
Dies erfordert einen Verweis auf system.web.security. Es ist auch der Application_EndRequest-Ereignishandler (oder ein ähnlicher), der so geschützt ist, dass Application_EndRequest (Objektabsender, EventArgs e) {etc ...
Nuander
2
Der aktualisierte Link zur Dokumentation zur Konfiguration des Sitzungsstatus befindet sich hier: (Seltsamerweise ist die Version 3.0 nicht archiviert, die meisten anderen jedoch) msdn.microsoft.com/en-us/library/h6bb9cz9(v=vs.85).aspx . Darüber hinaus sollten Sie , wie Marcel Hoyer in seiner Antwort feststellt, in der Lage sein, requireSSL="true"das httpCookiesElement festzulegen, und dies wird funktionieren. Möglicherweise müssen Sie zuerst Ihre vorhandenen Cookies löschen, bevor Sie die Änderung sehen.
Zhaph - Ben Duguid
167

Um das ; secureSuffix zum Set-Cookiehttp-Header hinzuzufügen, habe ich einfach das <httpCookies>Element in der web.config verwendet:

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

IMHO viel praktischer als das Schreiben von Code wie im Artikel von Anubhav Goyal.

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

Marcel Hoyer
quelle
2
msdn.microsoft.com/en-us/library/ms228262(v=vs.100).aspx (Dieses MSDN-Thema ist derzeit nicht für .NET 4.5 verfügbar.)
Lars Kemmann
9
Marcel Hoyer, ich habe deine Methode ausprobiert, aber irgendwie funktioniert sie einfach nicht. Das asp.net_sessionidist noch nicht drin secure. Gilt Ihre Methode für eine MVC-Webanwendung?
Blaise
@Blaise, ich habe dies nicht für eine MVC-Web-App versucht. Hat noch jemand?
Marcel Hoyer
2
Ich weiß, dass dies alt ist, aber ich musste dies in einem MVC4-Projekt implementieren, und es funktioniert großartig. Die sichere hinzugefügt; Flagge zum Cookie.
Puddinman13
12
Wenn Sie web.config korrekt konfigurieren und die ASP.NET_SessionId immer noch nicht als sicher gekennzeichnet ist, müssen Sie Ihre Cookies für die Site löschen, bevor Sie sie erneut testen. Nur weil Sie abgemeldet / nicht authentifiziert sind, erhalten Sie kein neues Sitzungscookie.
Adam Caviness
16

Wenn Sie die obige Lösung von Marcel verwenden, um das Formularauthentifizierungs-Cookie zu sichern, sollten Sie auch das Konfigurationselement "Authentifizierung" aktualisieren, um SSL zu verwenden

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

Andere weise Authentifizierungs-Cookies sind nicht https

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

Raghu A.
quelle
2
Dies sichert die Formularauthentifizierung. Cookie nur richtig? Es wird nicht angenommen, dass das Sitzungscookie gesichert wird, das hier die eigentliche Frage war.
Rahatur
9

Es wurde festgestellt, dass das Festlegen der sicheren Eigenschaft in Session_Start ausreichend ist, wie im MSDN-Blog " Sichern der Sitzungs-ID: ASP / ASP.NET " mit einigen Erweiterungen empfohlen .

    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 = "/";
        }
    }
Doug Domeny
quelle
2

Hinzufügen zu @ JoelEthertons Lösung, um eine neu entdeckte Sicherheitslücke zu beheben. Diese Sicherheitsanfälligkeit tritt auf, wenn Benutzer HTTP anfordern und zu HTTPS umgeleitet werden, das Sitzungs-ID-Cookie jedoch bei der ersten Anforderung an HTTP als sicher festgelegt wird. Laut McAfee Secure ist dies jetzt eine Sicherheitslücke.

Dieser Code schützt Cookies nur, wenn die Anfrage HTTPS verwendet. Das Sessionid-Cookie läuft ab, wenn nicht HTTPS.

    // 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);
    }
Jonathan Harris
quelle
-3

Wenn die gesamte Site HTTPS verwendet, ist Ihr sessionId-Cookie mindestens so sicher wie die HTTPS-Verschlüsselung. Dies liegt daran, dass Cookies als HTTP-Header gesendet werden und bei Verwendung von SSL die HTTP-Header bei der Übertragung mit SSL verschlüsselt werden.

Nick Berardi
quelle
15
Beachten Sie jedoch, dass die erste Anforderung an diesen Server (einschließlich Cookies) unsicher wäre, wenn ein Benutzer die URL in den Browser "www.securesite.com" eingeben würde. Der Server wird vermutlich mit einer Umleitung auf die SSL-Site antworten, wonach Sie korrekt sind.
Chris Shaffer
3
Das macht Sinn, aber leider sehen es die Tester, die unser Kunde benutzt, nicht so :)
Pete
"Die HTTP-Header werden bei der Übertragung mit SSL verschlüsselt." Bedeutet dies, dass der Kanal verschlüsselt ist oder dass der tatsächliche Cookie-Inhalt verschlüsselt ist?
Larry Hipp
2
Dies gilt nur, wenn der HTTP-Zugriff verweigert oder umgeleitet wird. Selbst wenn dies der Fall ist, ist das Setzen des Cookies eine zusätzliche Ausfallsicherheit.
SpongeBoy
4
@ Spongeboy Eigentlich ist es in diesen Szenarien nicht einmal wahr. Wenn es einen Mann in der Mitte gäbe, hätten sie bereits eine Kopie des Cookies, bevor der Server einen Weiterleitungsstatuscode zurückgab.
Richard Szalay