Предотвращение CSRF с атрибутом cookie того же сайта
Я занимался серфингом в Интернете и нашел статью Предотвращение CSRF с атрибутом cookie того же сайта.
Как и при сохранении ссылки, нам нужно добавить заголовок Set-Cookie.
Set-Cookie: key=value; HttpOnly; SameSite=strict
Теперь мой вопрос: я хочу установить это на своем сайте ASP.NET во всех файлах cookie и аутентификации.
Я пытался установить это с помощью заголовка из IIS, но кто-то говорит, что это неправильный способ реализации.
Я также попробовал ниже.
HttpCookie newAuthenticationCookie = new HttpCookie(FormsAuthentication.FormsCookieName
, FormsAuthentication.Encrypt(newAuthenticationTicket))
{
HttpOnly = true
};
newAuthenticationCookie.Values.Add("SameSite", "strict");
Но похоже, что я не помогаю.
Пожалуйста, предложите мне лучший способ сделать это.
Благодарю.
Ответы
Ответ 1
После глубокого обзора HttpCookie Source он подтверждает, что мы не можем сделать это с помощью кода, так как нет никакого способа добавить дополнительный атрибут на Cookie и класс отмечены как запечатанные.
Но все-таки я управляю решением, изменяя web.config, как показано ниже.
<rewrite>
<outboundRules>
<rule name="Add SameSite" preCondition="No SameSite">
<match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
<action type="Rewrite" value="{R:0}; SameSite=strict" />
<conditions>
</conditions>
</rule>
<preConditions>
<preCondition name="No SameSite">
<add input="{RESPONSE_Set_Cookie}" pattern="." />
<add input="{RESPONSE_Set_Cookie}" pattern="; SameSite=strict" negate="true" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
Это добавляет SameSite = strict для каждого Set-Cookie.
Ответ 2
.NET 4.7.2 теперь имеет встроенную поддержку свойства SameSite
.
У HttpCookie
теперь есть свойство, которое называется SameSite
.
Подробнее здесь от Microsoft.
Больше не нужно взламывать это через файл конфигурации.
Ответ 3
Вы также можете установить это в коде при создании файла cookie:
var httpCookie = new HttpCookie("mycookie", "myvalue");
httpCookie.Path += ";SameSite=Strict";
Response.SetCookie(httpCookie);
Это даст вам следующий заголовок:
Set-Cookie:mycookie=myvalue; path=/;SameSite=Strict
бит взлома, пока он не подтолкнется к фреймворку.
Ответ 4
Потому что в этот день и в возрасте мы используем owin, чтобы исправить ту же глупую ошибку cookie webapi...
public class CookieSameSiteMiddleware : OwinMiddleware
{
public CookieSameSiteMiddleware(OwinMiddleware next) : base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
var url = context.Request.Path.Value.ToLowerInvariant();
if (url.Contains("/api/mylogin"))
{
context.Response.OnSendingHeaders(x =>
{
var scv = context.Response.Headers.FirstOrDefault(h => h.Key == "Set-Cookie");
if (!scv.Equals(default(KeyValuePair<string, string[]>)))
{
//context.Response.Headers.Remove("Set-Cookie");
context.Response.Headers.Set("Set-Cookie", scv.Value[0] + "; SameSite=strict");
}
}, null);
}
await this.Next.Invoke(context);
}
}
Удостоверьтесь, что среднее изделие зарегистрировано раньше .UseWebApi()
Ответ 5
До 4.7.2 вы можете просто добавить строку в путь к cookie.
FormsAuthentication.SetAuthCookie(username, false, FormsAuthentication.FormsCookiePath + "; SameSite=Lax");
Ответ 6
Просто добавьте мой ответ, чтобы систематизировать всю информацию, найденную здесь и в других местах.
1. Для обеспечения безопасности пользовательских файлов cookie в соответствии с 4.7.2
var c = new HttpCookie("test");
c.SameSite = SameSiteMode.Lax;
2. Для обеспечения безопасности файла cookie для проверки подлинности с помощью форм
В web.config
<authentication mode="Forms">
<forms ..... cookieSameSite="Lax" />
</authentication>
3. Для защиты файла cookie сеанса ASP.NET
В Global.asax
void Session_Start(Object sender, EventArgs e)
{
Response.Cookies["ASP.NET_SessionId"].SameSite = SameSiteMode.Lax;
//while we're at it lets also make it secure
if (Request.IsSecureConnection)
Response.Cookies["ASP.NET_SessionId"].Secure = true;
}
Интересный факт: даже если вы установите <httpCookies requireSSL="true" />
, cookie файл сеанса ASP.NET по-прежнему будет небезопасным по какой-то причине.
4. <httpCookies samesite=xxx>
не работает
Добавление <httpCookies sameSite="Strict" />
, как предложено в комментарии выше в web.config, не сработало, я получил ошибку.
Нераспознанный атрибут "тот же сайт"
Даже при том, что я нацеливаюсь на 4.7.2. Протестировано на нескольких проектах и на нескольких машинах, также VS2019 не показывает это в intellisense, и документы MS не упоминают об этом нигде.
Ответ 7
Чтобы определить SameSite для файла cookie ASP.NET_SessionId, мне нужно было установить файл web.config в разделе system.web:
<sessionState cookieSameSite="Lax" />