coding/asp.net
@Html.AntiForgeryToken();
사과키라임파이
2022. 4. 22. 17:40
@Html.AntiForgeryToken();
위조방지토큰
form에서는 @Html.AntiForgeryToken(); 사용,
CSHTML복사
@using (Html.BeginForm("Manage", "Account")) {
@Html.AntiForgeryToken()
}
CSRF 및 AJAX 방지
AJAX 요청이 HTML 양식 데이터가 아닌 JSON 데이터를 보낼 수 있으므로 양식 토큰은 AJAX 요청에 문제가 될 수 있습니다. 한 가지 솔루션은 사용자 지정 HTTP 헤더에 토큰을 보내는 것입니다. 다음 코드는 Razor 구문을 사용하여 토큰을 생성한 다음 AJAX 요청에 토큰을 추가합니다. 토큰은 AntiForgery.GetTokens를 호출하여 서버에서 생성됩니다.
HTML복사
<script>
@functions{
public string TokenHeaderValue()
{
string cookieToken, formToken;
AntiForgery.GetTokens(null, out cookieToken, out formToken);
return cookieToken + ":" + formToken;
}
}
$.ajax("api/values", {
type: "post",
contentType: "application/json",
data: { }, // JSON data goes here
dataType: "json",
headers: {
'RequestVerificationToken': '@TokenHeaderValue()'
}
});
</script>
요청을 처리하는 경우 요청 헤더에서 토큰을 추출합니다. 그런 다음 AntiForgery.Validate 메서드를 호출하여 토큰의 유효성을 검사합니다. 토큰이 유효하지 않으면 Validate 메서드가 예외를 throw합니다.
C#복사
void ValidateRequestHeader(HttpRequestMessage request)
{
string cookieToken = "";
string formToken = "";
IEnumerable<string> tokenHeaders;
if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
{
string[] tokens = tokenHeaders.First().Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
}
AntiForgery.Validate(cookieToken, formToken);
}