Как обеспечить безопасность ASP.NET sessionId cookie?


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

весь сайт использует HTTPS, поэтому нет необходимости, чтобы cookie работал как с http, так и с https.

6   51   2011-05-12 17:26:29

6 ответов:

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

// 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 в глобальном.asax должен сделать это для всех страниц вызовы.

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

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

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

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

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

посмотреть: http://msdn.microsoft.com/en-us/library/ms228262(в=против 100).аспн

идя с решением Марселя выше, чтобы защитить файлы cookie проверки подлинности форм, вы также должны обновить элемент конфигурации "аутентификация" для использования SSL

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

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

посмотреть: http://msdn.microsoft.com/en-us/library/vstudio/1d3t3c61(в=против 100).аспн

найдено, что установка безопасного свойства в 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 = "/";
        }
    }

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

этот код будет защищать только куки, если запрос использует HTTPS. Он истечет cookie sessionid, если не 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);
    }

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