Как защитить файл cookie ASP.NET_SessionId?

Я установил файл cookie.ASPXAUTH только для https, но я не уверен, как эффективно сделать то же самое с ASP.NET_SessionId.

Весь сайт использует HTTPS, поэтому cookie не нужно работать как с http, так и с https.

Ответ 1

Вот фрагмент кода, взятый из статьи блога , написанной Анубхав Гоял:

// 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;
        }
    }
}

Добавление этого в обработчик событий EndRequest в global.asax должно сделать это для всех вызовов страницы.

Примечание: было предложено редактирование, чтобы добавить оператор break; в успешное "безопасное" назначение. Я отклонил это изменение, основываясь на том, что оно позволит принудительно защитить только один из файлов cookie, а второй будет проигнорирован. Не исключено добавить счетчик или какой-либо другой показатель, чтобы определить, что оба они были защищены, и сломаться в этой точке.

Ответ 2

Чтобы добавить суффикс ; secure в заголовок http Set-Cookie, я просто использовал элемент <httpCookies> в web.config:

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

ИМХО гораздо удобнее, чем писать код, как в статье Анубхава Гояла.

Видеть: http://msdn.microsoft.com/en-us/library/ms228262(v=vs.100).aspx

Ответ 3

Следуя приведенному выше решению 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

Ответ 4

Установлено, что установка защищенного свойства в Session_Start является достаточной, как рекомендовано в блоге MSDN "Защита идентификатора сеанса: 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 = "/";
        }
    }

Ответ 5

Добавление решения @JoelEtherton для исправления обнаруженной уязвимости безопасности. Эта уязвимость возникает, если пользователи запрашивают HTTP и перенаправляются на HTTPS, но cookie файл сеанса устанавливается как защищенный при первом запросе HTTP. По словам McAfee Secure, это уязвимость безопасности.

Этот код будет защищать куки, только если запрос использует HTTPS. Срок действия файла cookie сеанса истечет, если не 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);
    }

Ответ 6

Если весь сайт использует HTTPS, ваш cookie sessionId так же безопасен, как и HTTPS-шифрование. Это связано с тем, что файлы cookie отправляются как HTTP-заголовки, а при использовании SSL заголовки HTTP шифруются с использованием SSL при передаче.