web-dev-qa-db-fra.com

Comment sécuriser le cookie ASP.NET_SessionId?

J'ai défini le cookie .ASPXAUTH sur https uniquement, mais je ne sais pas comment procéder de manière efficace avec ASP.NET_SessionId.

L'ensemble du site utilise HTTPS, il n'est donc pas nécessaire que le cookie fonctionne avec http et https.

53
Pete

Voici un extrait de code tiré d'un article de blog écrit par 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;
        }
    }
}

L'ajout de cela au gestionnaire d'événements EndRequest dans le fichier global.asax devrait permettre de réaliser cela pour tous les appels de page.

Remarque: Une modification a été proposée pour ajouter une instruction break; dans une affectation "sécurisée" réussie. J'ai rejeté cette modification en partant de l'idée que seuls l'un des cookies pouvait être forcé à sécuriser et que le second serait ignoré. Il n'est pas inconcevable d'ajouter un compteur ou une autre métrique pour déterminer que les deux ont été sécurisés et pour rompre à ce stade. Cependant, avec des techniques de code plus récentes, cela serait probablement mieux écrit ainsi:

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

Pour ajouter le suffixe ; secure à l'en-tête Set-Cookie http, j'ai simplement utilisé l'élément <httpCookies> dans le fichier web.config:

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

IMHO beaucoup plus pratique que l'écriture de code comme dans l'article d'Anubhav Goyal. 

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

128
Marcel Hoyer

En allant avec la solution de Marcel ci-dessus pour sécuriser le cookie d'authentification par formulaires, vous devez également mettre à jour l'élément de configuration "authentication" pour utiliser SSL

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

Un autre cookie d'authentification ne sera pas https

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

13
Raghu A

Il a été constaté que la définition de la propriété secure dans Session_Start est suffisante, comme recommandé dans le blog MSDN " ID de session de sécurisation: ASP/ASP.NET " avec une certaine augmentation.

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

Ajout sur la solution de @ JoelEtherton pour corriger une faille de sécurité récemment trouvée. Cette vulnérabilité se produit si les utilisateurs demandent HTTP et sont redirigés vers HTTPS, mais que le cookie sessionid est défini sur sécurisé lors de la première demande HTTP. C'est désormais une faille de sécurité, selon McAfee Secure.

Ce code ne sécurisera les cookies que si la requête utilise HTTPS. Il expirera le cookie sessionid, sinon 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);
    }
0
Jonathan Harris