CA5391: ASP.NET Core MVC 컨트롤러에서 위조 방지 토큰 사용
속성 | 값 |
---|---|
규칙 ID | CA5391 |
제목 | ASP.NET Core MVC 컨트롤러에서 위조 방지 토큰을 사용하세요. |
범주 | 보안 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 아니요 |
원인
작업이 수정되도록 하는 동작에 위조 방지 토큰 특성이 없습니다. 또는 예상되는 위조 방지 토큰 함수를 호출하지 않고 글로벌 위조 방지 토큰 필터를 사용합니다.
규칙 설명
위조 방지 토큰의 유효성을 검사하지 않고 POST
, PUT
, PATCH
또는 DELETE
요청을 처리하면 교차 사이트 요청 위조 공격에 취약할 수 있습니다. 교차 사이트 요청 위조 공격은 인증된 사용자의 악의적인 요청을 ASP.NET Core MVC 컨트롤러로 보낼 수 있습니다.
위반 문제를 해결하는 방법
- 수정 작업을 유효한 위조 방지 토큰 특성으로 표시합니다.
- Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute.
- 이름이
%Validate%Anti_orgery%Attribute
같은 특성.
- Microsoft.AspNetCore.Mvc.Filters.FilterCollection.Add를 사용하여 유효한 위조 토큰 특성을 글로벌 필터에 추가합니다.
- Microsoft.AspNetCore.Antiforgery.IAntiforgery 인터페이스를 구현하는 클래스에서
Validate
를 호출하는 사용자 지정 또는 MVC 제공 위조 방지 필터 클래스를 추가합니다.
경고를 표시하지 않는 경우
위조 방지 토큰 특성 사용 이외의 다른 솔루션을 채택하여 CSRF 취약성을 완화하는 경우 이 규칙을 표시하지 않는 것이 안전합니다. 자세한 내용은 ASP.NET Core에서 교차 사이트 요청 위조(XSRF/CSRF) 공격 방지를 참조하세요.
경고 표시 안 함
단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.
#pragma warning disable CA5391
// The code that's violating the rule is on this line.
#pragma warning restore CA5391
파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none
으로 설정합니다.
[*.{cs,vb}]
dotnet_diagnostic.CA5391.severity = none
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
분석할 코드 구성
규칙이 코드베이스에서 Microsoft.AspNetCore.Mvc.Controller의 파생 클래스에만 적용되는지를 구성할 수 있습니다. 예를 들어 ControllerBase의 파생 형식 내에 있는 코드에서 규칙이 실행되지 않도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가하세요.
dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true
의사 코드 예제
위조 방지 토큰 특성 위반이 없는 경우
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
}
유효한 글로벌 위조 방지 필터가 없는 경우
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
}
class FilterClass : IAsyncAuthorizationFilter
{
public Task OnAuthorizationAsync (AuthorizationFilterContext context)
{
return null;
}
}
class BlahClass
{
public static void BlahMethod ()
{
FilterCollection filterCollection = new FilterCollection ();
filterCollection.Add(typeof(FilterClass));
}
}
위조 방지 토큰 특성 솔루션으로 표시된 경우
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult ExampleAction ()
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction ()
{
return null;
}
}
유효한 글로벌 위조 방지 필터를 사용하는 경우
using System.Threading.Tasks;
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction()
{
return null;
}
[HttpDelete]
public IActionResult ExampleAction()
{
return null;
}
}
class FilterClass : IAsyncAuthorizationFilter
{
private readonly IAntiforgery antiforgery;
public FilterClass(IAntiforgery antiforgery)
{
this.antiforgery = antiforgery;
}
public Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
return antiforgery.ValidateRequestAsync(context.HttpContext);
}
}
class BlahClass
{
public static void BlahMethod()
{
FilterCollection filterCollection = new FilterCollection();
filterCollection.Add(typeof(FilterClass));
}
}
.NET