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) 을 사용자 정의 합 니 다. 다음 과 같은 몇 가 지 를 주의해 야 합 니 다.Reauest.IsAjaxRequest()
방법 으로 false 로 판정 되 었 습 니 다. header 에 {"X-Requested-With" : "XMLHttpRequest"}
이 키 와 값 __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()';
}]);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
작업 중 문제 해결 - (win 2003 asp. net) Session 과 페이지 전송 방법 으로 해결 방안 을 정상적으로 사용 할 수 없습니다.또한 F 는 처음에 우리 의 BP & IT 프로젝트 팀 이 Forms 폼 검증 을 사용 했다 고 판단 할 수 있 습 니 다. 페이지 를 뛰 어 넘 는 것 은http://hr.bingjun.cc/MyTask/MyTas...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.