동일한 사이트 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
'programing' 카테고리의 다른 글
STATICFILES_DIR, STATIC_ROOT 및 MEDIA_ROOT의 차이점 (0) | 2023.08.19 |
---|---|
AJAX 응답을 기다리는 동안 이미지를 로드하려면 어떻게 해야 합니까? (0) | 2023.08.14 |
Swift에서 x분마다 무언가 하기 (0) | 2023.08.14 |
가장 느린 쿼리를 찾는 방법 (0) | 2023.08.14 |
배열 길이를 세고 요소가 하나만 포함된 경우 1을 반환합니다. (0) | 2023.08.14 |