Как обезопасить файл cookie ASP.NET_SessionId?
Я установил для файла cookie .ASPXAUTH только https, но я не уверен, как эффективно сделать то же самое с ASP.NET_SessionId.
Весь сайт использует HTTPS, поэтому нет необходимости использовать cookie для работы с http и https.
7 ответов
Вот фрагмент кода, взятый из статьи в блоге, написанной Анубхав Гоял:
// 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;
Чтобы добавить ; 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
Переходя к вышеупомянутому решению 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
Обнаружено, что установки свойства 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 = "/";
}
}
Также стоит учитывать:
Использование префиксов файлов cookie
__Secure-, which signals to the browser that the Secure attribute is required.
__Host-, which signals to the browser that both the Path=/ and Secure attributes are required, and at the same time, that the Domain attribute must not be present.
Хорошая статья о том, почему это помогает
https://check-your-website.server-daten.de/prefix-cookies.html
Переименование файлов cookie
Вместо использования имен, которые четко идентифицируют язык программирования.
например
ASP.NET_SessionId = __Secure-SID
Использование настроек того же сайта
sameSite="Lax"
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
Сделать cookie https безопасным
requireSSL="true"
БЕЗОПАСНЫЙ ПРИМЕР
<sessionState cookieless="false" cookieName="__Secure-SID" cookieSameSite="Lax" />
<httpCookies httpOnlyCookies="true" sameSite="Lax" requireSSL="true" />
Добавление решения @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);
}
Если весь сайт использует HTTPS, ваш cookie для sessionId так же безопасен, как и шифрование HTTPS. Это связано с тем, что файлы cookie отправляются как заголовки HTTP, а при использовании SSL заголовки HTTP шифруются с использованием SSL при передаче.