programing

동일한 사이트 cookie 속성으로 CSRF 차단

i4 2023. 8. 14. 22:28
반응형

동일한 사이트 cookie 속성으로 CSRF 차단

웹서핑을 하다가 같은 사이트 쿠키 속성을 가진 CSRF 방지 기사를 발견했습니다.

온링크 유지관리 Set-Cookie 헤더를 추가해야 합니다.

Set-Cookie: 키=값, HttpOnly, SameSite=디버깅

이제 제 질문은, 제 ASP에 이것을 설정하고 싶습니다.모든 쿠키 및 인증 쿠키의 NET 사이트입니다.IIS의 헤더를 사용하여 이것을 설정하려고 했지만 누군가가 이것이 잘못된 방식 구현이라고 합니다.

저는 아래에도 시도해 보았습니다.

HttpCookie newAuthenticationCookie = new HttpCookie(FormsAuthentication.FormsCookieName
                    , FormsAuthentication.Encrypt(newAuthenticationTicket))
                {
                    HttpOnly = true
                };
newAuthenticationCookie.Values.Add("SameSite", "strict");

하지만 그것은 나에게 도움이 되지 않는 것 같습니다.

이것을 하는 더 좋은 방법을 제안해 주세요.

감사해요.

HttpCookie 소스에 대한 심층 검토 후 쿠키에 추가 속성을 추가할 방법이 없으며 클래스가 봉인된 것으로 표시되어 있으므로 코드로 이 작업을 수행할 수 없음이 확인되었습니다.

하지만 어쨌든는 아래와 같이 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>

이렇게 하면 각 Set-Cookie에 동일한 사이트=를 추가할 수 있습니다.

쿠키를 만들 때 코드로 설정할 수도 있습니다.

var httpCookie = new HttpCookie("mycookie", "myvalue");
httpCookie.Path += ";SameSite=Strict";

Response.SetCookie(httpCookie);

그러면 다음 헤더가 제공됩니다.

Set-Cookie:mycookie=myvalue; path=/;SameSite=Strict

프레임워크에 밀어넣기 전까지는 약간의 해킹.

여기와 다른 곳에서 발견된 모든 정보를 체계화하기 위해 제 답변을 추가하는 것입니다.

4.7.2 이상 버전에서 사용자 정의 쿠키를 보호하려면 다음과 같이 하십시오.

var c = new HttpCookie("test");
c.SameSite = SameSiteMode.Lax;

양식 인증 쿠키를 보호하려면

web.config에서

<authentication mode="Forms">
    <forms ..... cookieSameSite="Lax" />
</authentication>

ASP를 보호하기 위해.NET 세션 쿠키

전역.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" />ASPNET 세션 쿠키는 어떤 이유로든 여전히 보안되지 않습니다.

3(a). 업데이트 01.2020: .NET 4.8 세션 쿠키는 이제 기본적으로 "SameSite"입니다.

최신 Windows Update를 설치하면 세션 쿠키가 만들어집니다.Lax결석으로여기서 제어할 수 있습니다.

<sessionState cookieSameSite="Lax" /> <!-- in system.web -->

4. <httpCookies samesite=xxx>존재하지 않습니까?

추가 중<httpCookies sameSite="Strict" />위의 web.config 댓글에서 제안한 것처럼 작동하지 않았습니다. 오류가 발생했습니다.

인식할 수 없는 특성 'same site'

4.7.2를 목표로 하고 있지만,여러 프로젝트와 여러 시스템에서 테스트한 결과, VS2019는 이러한 인텔리전스를 보여주지 않으며 MS 문서에서도 이를 언급하지 않습니다.

.NET 4.7.2는 이제 에 대한 기본 지원을 제공합니다.SameSite소유물.
HttpCookie이제 에 대한 속성이 있습니다.SameSite.
Microsoft의 자세한 내용은 여기를 참조하십시오.

더 이상 구성 파일을 해킹할 필요가 없습니다.

SameSite를 ASP에 정의하려면 다음과 같이 하십시오.NET_SessionId 쿠키 시스템에서 web.config를 설정해야 했습니다.웹 섹션:

<sessionState cookieSameSite="Lax" />

왜냐하면 요즘 시대에 우리는 똑같은 바보 같은 webapi 쿠키 버그를 고치기 위해 owin을 사용하기 때문입니다.

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);
    }
}

미들웨어가 이전에 등록되어 있는지 확인합니다.WebApi() 사용

4.7.2 이전 버전에서는 쿠키 경로에 문자열을 추가할 수 있습니다.

FormsAuthentication.SetAuthCookie(username, false, FormsAuthentication.FormsCookiePath + "; SameSite=Lax");

https://www.nuget.org/packages/Microsoft.Owin.Security.Cookies/4.1.0 은 이제 SameSite를 지원합니다.

이는 매우 좋은 소식입니다. 왜냐하면 여기 있는 다른 솔루션들은 그렇게 훌륭하게 작동하지 않기 때문입니다.

구현: 성능을 제외하면 매우 효과적입니다.이는 환경에 따라 다르겠지만 이 솔루션은 CPU의 약 10%를 차지했습니다.

<outboundRules>아마 일을 시작할 수 있을 겁니다.그러나 이 스레드에 있는 솔루션을 포함하여 지금까지 확인하고 테스트한 모든 솔루션은 동일한 응답에 여러 쿠키가 설정되어 있을 때 몇 가지 문제가 있었습니다.

언급URL : https://stackoverflow.com/questions/38954821/preventing-csrf-with-the-same-site-cookie-attribute

반응형