Предотвращение 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" />