asp. net MVC 에서 크로스 오 버 요청 공격 (CSRF) 을 방지 하 는 ajax 용법

4353 단어 asp.net
참고:
Preventing Cross-Site Request Forgery (CSRF) Attacks Validating .NET MVC 4 anti forgery tokens in ajax requests
화면 음악 c 에서 마이크로소프트 는 CSRF 를 방지 하 는 간단 한 방법 을 제공 했다. 바로 전단 form 폼 에 Anti - forgery Tokens 를 추가 하 는 것 이다.
<form action="/Home/Test" method="post">

    <input name="__RequestVerificationToken" type="hidden"   

           value="6fGBtLZmVBZ59oUad1Fr33BuPxANKY9q3Srr5y[...]" />    

    <input type="submit" value="Submit" />

</form>

razor 의 쓰 기 는 매우 간단 하 다.
@using (Html.BeginForm("Manage", "Account")) {

    @Html.AntiForgeryToken()

}

백 엔 드 는 action 에 [Validate AntiForgery Token] 탭 만 추가 하면 됩 니 다.
//

// POST: /execute/uploadfile/

[HttpPost]

[MyValidateAntiForgeryToken]

public ActionResult UploadFile()

{

	// codes here

}

그럼 ajax 요청 은 요?먼저, 저 는 header 에 __RequestVerificationToken 값 을 추가 하려 고 했 습 니 다. 값 은 razor 에서 생 성 되 었 습 니 다. 결 과 는 잘못 되 었 습 니 다. 최종 적 으로 사용자 정의 해 야 합 니 다. 기본 [ValidateAntiForgeryToken] 이 안 되 기 때문에 우 리 는 하나의 MyValidateAntiForgeryTokenAttribute (세 션 1) 을 사용자 정의 합 니 다. 다음 과 같은 몇 가 지 를 주의해 야 합 니 다.
  • filter 에서 요청 이 ajax 요청 인지 아 닌 지 스스로 판단 합 니 다. ajax 요청 이 있 었 다 면 Reauest.IsAjaxRequest() 방법 으로 false 로 판정 되 었 습 니 다. header 에 {"X-Requested-With" : "XMLHttpRequest"} 이 키 와 값
  • 이 있 는 지 확인 하 십시오.
  • 사용자 정의 필터 인 이상 header 에 있 는 이 키 는 굳이 __RequestVerificationToken 가 필요 없습니다. 앞 뒤로 대응 하면 됩 니 다.
  • 값 을 어떻게 추출 하 는 지 에 대해 서 는 @html 로 확 장 된 쓰기 방법 을 소개 한 다음 에 js 의 방법 으로 값 을 추출 할 수도 있 고 아래 세 션 2 의 쓰기 방법 으로 직접 razor 로 js 에 쓸 수도 있 습 니 다. 세 션 3 에 사용 방법 (본 사례 에서 하나의 angular 의 예, 선별 에 주의 하 세 요)
  • 이 있 습 니 다.
  • 마지막 으로 응용 액 션 전에 시스템 의 기본 탭 을 사용자 정의 로 바 꾸 면 됩 니 다.

  • 세 션 1, 사용자 정의 anti csrf 필터
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    
    public class MyValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
    
    {
    
        private void ValidateRequestHeader(HttpRequestBase request)
    
        {
    
            string cookieToken = String.Empty;
    
            string formToken = String.Empty;
    
            string tokenValue = request.Headers["RequestVerificationToken"];
    
            if (!String.IsNullOrEmpty(tokenValue))
    
            {
    
                string[] tokens = tokenValue.Split(':');
    
                if (tokens.Length == 2)
    
                {
    
                    cookieToken = tokens[0].Trim();
    
                    formToken = tokens[1].Trim();
    
                }
    
            }
    
            AntiForgery.Validate(cookieToken, formToken);
    
        }
    
    
    
        public void OnAuthorization(AuthorizationContext filterContext)
    
        {
    
    
    
            try
    
            {
    
                if (filterContext.HttpContext.Request.IsAjaxRequest())
    
                {
    
                    ValidateRequestHeader(filterContext.HttpContext.Request);
    
                }
    
                else
    
                {
    
                    AntiForgery.Validate();
    
                }
    
            }
    
            catch (HttpAntiForgeryException e)
    
            {
    
                throw new HttpAntiForgeryException("Anti forgery token cookie not found");
    
            }
    
        }
    
    }

    세 션 2, @ function 세 션 정의
    @functions{
    
        public string TokenHeaderValue()
    
        {
    
            string cookieToken, formToken;
    
            AntiForgery.GetTokens(null, out cookieToken, out formToken);
    
            return cookieToken + ":" + formToken;
    
        }
    
    }

    세 션 3, 정 의 된 @ function 세 션 을 사용 합 니 다.
    var app = angular.module('srv', ['angularLocalStorage', 'angularFileUpload']);
    
    app.config(['$httpProvider', function($httpProvider) {
    
    	$httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
    
    	$httpProvider.defaults.headers.common["RequestVerificationToken"] = '@TokenHeaderValue()';
    
    }]);

    좋은 웹페이지 즐겨찾기