위조 방지 토큰 목적, 설명 및 예


310

ValidateAntiForgeryToken 목적 을 설명 ValidateAntiForgeryToken하고 MVC 4 에 대한 예를 보여 주 시겠습니까?

이 속성을 설명하는 예를 찾을 수 없습니까?



1
그건 그렇고, 나는 MS가 왜 이것을 .BeginForm도우미 안에 넣을 수 없었는지 이해하지 못한다 . Rails와 같이 자동으로 존재합니다.
jazzcat

답변:


350

MVC의 위조 방지 지원은 고유 한 값을 HTTP 전용 쿠키에 쓴 다음 동일한 값을 양식에 씁니다. 페이지가 제출 될 때 쿠키 값이 양식 값과 일치하지 않으면 오류가 발생합니다.

이 기능은 사이트 간 요청 위조를 방지 합니다. 즉, 인증 된 사용자의 자격 증명을 사용하여 숨겨진 콘텐츠를 제출하기 위해 사이트에 게시하는 다른 사이트의 양식입니다. 공격은 로그인 한 사용자가 양식을 제출하도록 속이거나 페이지가로드 될 때 단순히 프로그래밍 방식으로 양식을 트리거하는 것과 관련이 있습니다.

이 기능은 다른 유형의 데이터 위조 또는 변조 기반 공격을 방지하지 않습니다.

이를 사용하려면 작업 메소드 또는 제어기를 ValidateAntiForgeryToken속성으로 장식하고 메소드에 @Html.AntiForgeryToken()게시하는 양식에서 호출 하십시오.


5
@ 크리스 그것은 둘 다입니다. 내 대답에 따르면 : "HTTP 전용 쿠키에 고유 한 값을 다음 동일한 값이 양식에 기록됩니다 "
Richard Szalay

21
이것이 기본적으로 설정되지 않은 이유는 무엇입니까?
Christian Hagelid

12
@Christian은 Ruby on Rails가 아니기 때문에. ;-)
Martin Capodici

6
__RequestVerificationToken과 쿠키 __RequestVerificationToken의 형식이 동일하지 않은 것 같습니다. 쌍으로 작동합니다.
WaiKit Kung

5
@rdans 전혀, CORS와 CSRF는 완전히 다릅니다. CORS는 다른 도메인이 서버의 API에 액세스 할 수 있도록하기위한 것이며 CSRF는 예상 한 페이지에서 양식 게시물을 가져 오는 것입니다.
Richard Szalay

52

ValidateAntiForgeryToken 특성의 기본 목적은 사이트 간 요청 위조 공격을 방지하는 것입니다.

사이트 간 요청 위조 란 신뢰할 수있는 사용자의 브라우저에서 유해한 스크립트 요소, 악의적 인 명령 또는 코드가 전송되는 공격입니다. 이에 대한 자세한 내용은 http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages 를 방문 하십시오 .

사용하기 간단합니다. ValidateAntiForgeryToken 속성을 사용하여 메소드를 아래와 같이 장식해야합니다.

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult CreateProduct(Product product)  
{
  if (ModelState.IsValid)  
  {
    //your logic 
  }
  return View(ModelName);
}

System.Web.Mvc 네임 스페이스에서 파생됩니다.

그리고보기 에서이 코드를 추가하여 토큰을 추가하면 제출시 양식의 유효성을 검사하는 데 사용됩니다.

@Html.AntiForgeryToken()

예, 그렇습니다. 양식에서 @ Html.AntiForgeryToken ()을 호출하고 ValidateAntiForgeryTokenAttribute를 보호하려는 조치 메소드에 추가해야합니다.
Chandra Malla

이 간단한 답변을 이해해 주셔서 감사합니다 :)
noobprogrammer

4

ASP.Net Core에서 위조 방지 토큰은 자동으로 양식에 추가 @Html.AntiForgeryToken()되므로 면도기 양식 요소를 사용하거나 IHtmlHelper.BeginForm을 사용하고 양식의 메소드가 GET이 아닌 경우 추가 할 필요 가 없습니다.

다음과 비슷한 양식의 입력 요소를 생성합니다. <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

사용자가 양식을 제출하면 유효성 검사가 활성화되어 있으면 서버 쪽에서이 토큰이 확인됩니다.

[ValidateAntiForgeryToken]속성은 조치에 대해 사용될 수 있습니다. 요청에 유효한 위조 방지 토큰이 포함되어 있지 않으면이 필터가 적용된 작업에 대한 요청이 차단됩니다.

[AutoValidateAntiforgeryToken]속성은 컨트롤러에 사용할 수 있습니다. 이 속성은 다음 HTTP 메소드를 사용하여 작성된 요청에 대한 토큰이 필요하지 않다는 점을 제외하고 ValidateAntiForgeryToken 속성과 동일하게 작동합니다. GET HEAD OPTIONS TRACE

추가 정보 : https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery


2

Microsoft는 보안 목적으로 응용 프로그램에서 사용하는 기본 제공 기능을 제공하므로 아무도 사이트를 해킹하거나 중요한 정보를 침해 할 수 없습니다.

에서 ValidateAntiForgeryToken에서 MVC 응용 프로그램의 목적 Harpreet 싱 :

ValidateAntiForgeryToken 사용

이 개념을 이해하기 위해 간단한 예를 들어 봅시다. 너무 복잡하게 만들고 싶지 않기 때문에 Visual Studio에서 이미 사용 가능한 MVC 응용 프로그램의 템플릿을 사용하려고합니다. 이 단계를 단계별로 수행합니다. 시작하자.

  1. 1 단계-기본 인터넷 템플릿을 사용하여 두 개의 MVC 응용 프로그램을 만들고 해당 이름을 각각 CrossSite_RequestForgery 및 Attack_Application으로 지정합니다.

  2. 이제 CrossSite_RequestForgery 애플리케이션의 Web Config를 열고 아래에 지정된 연결 문자열을 변경 한 후 저장하십시오.

`

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. 도구 >> NuGet Package Manager를 클릭 한 다음 Package Manager Console을 클릭하십시오.

  2. 이제 패키지 관리자 콘솔에서 아래 언급 된 세 가지 명령을 실행하여 데이터베이스를 작성하십시오.

인 에이블 마이그레이션 추가 마이그레이션 첫 번째 업데이트 데이터베이스

중요 사항-개발자가 작업하는 방식으로이 예제를 만들고 싶기 때문에 코드 우선 접근 방식으로 데이터베이스를 만들었습니다. 데이터베이스를 수동으로 만들 수도 있습니다. 당신의 선택입니다.

  1. 이제 계정 컨트롤러를 엽니 다. 여기에 유형이 post 인 register 메소드가 표시됩니다. 이 방법 위에는 [ValidateAntiForgeryToken]으로 사용 가능한 속성이 있어야합니다. 이 속성을 주석 처리하십시오. 이제 등록을 마우스 오른쪽 버튼으로 클릭하고보기로 이동을 클릭하십시오. 여기서 다시 HTML 도우미를 @ Html.AntiForgeryToken ()으로 찾을 수 있습니다. 이것도 언급하십시오. 응용 프로그램을 실행하고 등록 버튼을 클릭하십시오. URL은 다음과 같이 열립니다 :

http : // localhost : 52269 / Account / Register

참고 사항 -이제 모든 독자의 마음에서 제기되는 문제는 모든 사람이 요청을 확인하는 데 사용된다는 것을 알고 있기 때문에이 두 도우미가 주석을 달아야하는 이유입니다. 그런 다음이 도우미를 적용한 후와 적용하기 전에 차이점을 보여주고 싶기 때문입니다.

  1. 이제 Attack_Application 인 두 번째 응용 프로그램을 엽니 다. 그런 다음 계정 컨트롤러의 등록 방법을 엽니 다. 아래 표시된 것처럼 간단한 방법으로 POST 메소드를 변경하십시오.

    등록 양식
    1. @ Html.LabelFor (m => m.UserName) @ Html.TextBoxFor (m => m.UserName)
    2. @ Html.LabelFor (m => m.Password) @ Html.PasswordFor (m => m.Password)
    3. @ Html.LabelFor (m => m.ConfirmPassword) @ Html.PasswordFor (m => m.ConfirmPassword)

7. 이제 해커이고 CrossSite_RequestForgery 응용 프로그램에서 사용자를 등록 할 수있는 URL을 알고 있다고 가정합니다. 이제 Attacker_Application과 같은 위조 사이트를 만들고 post 메소드에 동일한 URL을 입력했습니다.

8.이 응용 프로그램을 지금 실행하고 레지스터 필드를 채우고 레지스터를 클릭하십시오. CrossSite_RequestForgery 애플리케이션에 등록 된 것을 볼 수 있습니다. CrossSite_RequestForgery 애플리케이션의 데이터베이스를 확인하면 입력 한 항목이 표시됩니다.

  1. 중요-이제 CrossSite_RequestForgery 애플리케이션을 열고 계정 컨트롤러에서 토큰을 주석 처리하고보기를 등록하십시오. 동일한 프로세스로 다시 등록하십시오. 그러면 아래와 같이 에러가 발생합니다.

'/'응용 프로그램에 서버 오류가 있습니다. ________________________________________ 위조 방지 쿠키 "__RequestVerificationToken"이 없습니다.

이것이 바로 개념입니다. View에 @ Html.AntiForgeryToken ()을 추가하면로드시 __RequestVerificationToken과 Controller 메서드에서 사용 가능한 [ValidateAntiForgeryToken]이 생성됩니다. 게시 시간에이 토큰을 일치시킵니다. 토큰이 동일하면 유효한 요청임을 의미합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.