Share via


CA3147: ValidateAntiForgeryToken을 사용하여 동사 처리기 표시

속성
규칙 ID CA3147
타이틀 ValidateAntiForgeryToken을 사용하여 동사 처리기를 표시하세요.
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

원인

ASP.NET MVC 컨트롤러 작업 메서드가 ValidateAntiForgeryTokenAttribute 또는 HTTP 동사를 지정하는 특성(예: HttpGetAttribute 또는 AcceptVerbsAttribute)으로 표시되지 않습니다.

규칙 설명

ASP.NET MVC 컨트롤러를 설계할 때 교차 사이트 요청 위조 공격에 유의해야 합니다. 교차 사이트 요청 위조 공격은 인증된 사용자의 악의적인 요청을 ASP.NET MVC 컨트롤러로 보낼 수 있습니다. 자세한 내용은 ASP.NET MVC 및 웹 페이지에서 XSRF/CSRF 방지를 참조하세요.

이 규칙은 ASP.NET MVC 컨트롤러 작업 메서드가 다음 중 하나에 해당하는지 확인합니다.

  • ValidateAntiforgeryTokenAttribute가 있으며 HTTP GET을 제외하고 허용되는 HTTP 동사를 지정합니다.

  • HTTP GET을 허용되는 동사로 지정합니다.

위반 문제를 해결하는 방법

  • HTTP GET 요청을 처리하고 잠재적으로 유해한 부작용이 없는 ASP.NET MVC 컨트롤러 작업인 경우 메서드에 HttpGetAttribute를 추가합니다.

    HTTP GET 요청을 처리하고 중요한 데이터 수정과 같이 잠재적으로 유해한 부작용이 있는 ASP.NET MVC 컨트롤러 작업이 있는 경우 애플리케이션이 교차 사이트 요청 위조 공격에 취약합니다. HTTP POST, PUT 또는 DELETE 요청만 중요한 작업을 수행하도록 애플리케이션을 다시 설계해야 합니다.

  • HTTP POST, PUT 또는 DELETE 요청을 처리하는 ASP.NET MVC 컨트롤러 작업인 경우 ValidateAntiForgeryTokenAttribute 및 허용되는 HTTP 동사를 지정하는 특성(AcceptVerbsAttribute, HttpPostAttribute, HttpPutAttribute 또는 HttpDeleteAttribute)을 추가합니다. 또한 MVC 뷰 또는 Razor 웹 페이지에서 HtmlHelper.AntiForgeryToken() 메서드를 호출해야 합니다. 예제는 편집 메서드 및 편집 보기 검사를 참조하세요.

경고를 표시하지 않는 경우

다음 경우에는 이 규칙의 경고를 표시하지 않아도 됩니다.

  • ASP.NET MVC 컨트롤러 작업에 유해한 부작용이 없습니다.
  • 애플리케이션이 다른 방식으로 위조 방지 토큰의 유효성을 검사합니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA3147
// The code that's violating the rule is on this line.
#pragma warning restore CA3147

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA3147.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

ValidateAntiForgeryToken 특성 예제

위반:

namespace TestNamespace
{
    using System.Web.Mvc;

    public class TestController : Controller
    {
        public ActionResult TransferMoney(string toAccount, string amount)
        {
            // You don't want an attacker to specify to who and how much money to transfer.

            return null;
        }
    }
}

해결 방법:

using System;
using System.Xml;

namespace TestNamespace
{
    using System.Web.Mvc;

    public class TestController : Controller
    {
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult TransferMoney(string toAccount, string amount)
        {
            return null;
        }
    }
}

HttpGet 특성 예제

위반:

namespace TestNamespace
{
    using System.Web.Mvc;

    public class TestController : Controller
    {
        public ActionResult Help(int topicId)
        {
            // This Help method is an example of a read-only operation with no harmful side effects.
            return null;
        }
    }
}

해결 방법:

namespace TestNamespace
{
    using System.Web.Mvc;

    public class TestController : Controller
    {
        [HttpGet]
        public ActionResult Help(int topicId)
        {
            return null;
        }
    }
}