Как обезопасить файл cookie ASP.NET_SessionId? - PullRequest
56 голосов
/ 12 мая 2011

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

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

Ответы [ 6 ]

134 голосов
/ 23 января 2012

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

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

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

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

43 голосов
/ 12 мая 2011

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

// 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, а второй будет проигнорирован.Не исключено добавить счетчик или какой-либо другой показатель, чтобы определить, что оба они были защищены, и сломаться в этой точке.Однако, с более новыми методами кода это, вероятно, было бы лучше написать как:

Response.Cookies[FormsAuthentication.FormsCookieName]?.Secure = true;
Response.Cookies["asp.net_sessionid"]?.Secure = true;
13 голосов
/ 17 сентября 2013

Используя решение Marcel, приведенное выше, для защиты cookie-файлов проверки подлинности с помощью форм, вы также должны обновить элемент конфигурации «authentication», чтобы использовать SSL

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

Другие файлы cookie для аутентификации не будут иметь https

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

7 голосов
/ 13 декабря 2013

Обнаружено, что установки свойства secure в 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 = "/";
        }
    }
0 голосов
/ 14 мая 2018

Добавление решения @ 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);
    }
0 голосов
/ 12 мая 2011

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

...