gpt4 book ai didi

asp.net-mvc - 防止针对 PUT 和删除请求的 CSRF 攻击 ASP.NET Web API

转载 作者:行者123 更新时间:2023-12-02 05:07:13 24 4
gpt4 key购买 nike

ValidateAntiForgeryToken 是否适用于 PUT 和删除请求,还是仅适用于 ASP.NET Web API 中的发布请求?如果不是,确保其安全的最佳方法是什么?

最佳答案

反 CSRF 通常是通过匹配来自 cookie 和正文的 token 来验证非 ajax 调用(如浏览器表单发布)中的请求。

在 ajax 调用中,建议在自定义 header 中放置一个 token 。如果您安装了最新的 ASP.NET 2012.2 update .它在 MVC 项目对话框中有一个 spa 模板,演示了如何在 SPA 应用程序中防止 CSRF。这是从模板复制的代码,用于从服务器端验证 header token 。

public class ValidateHttpAntiForgeryTokenAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
HttpRequestMessage request = actionContext.ControllerContext.Request;

try
{
if (IsAjaxRequest(request))
{
ValidateRequestHeader(request);
}
else
{
AntiForgery.Validate();
}
}
catch (HttpAntiForgeryException e)
{
actionContext.Response = request.CreateErrorResponse(HttpStatusCode.Forbidden, e);
}
}

private bool IsAjaxRequest(HttpRequestMessage request)
{
IEnumerable<string> xRequestedWithHeaders;
if (request.Headers.TryGetValues("X-Requested-With", out xRequestedWithHeaders))
{
string headerValue = xRequestedWithHeaders.FirstOrDefault();
if (!String.IsNullOrEmpty(headerValue))
{
return String.Equals(headerValue, "XMLHttpRequest", StringComparison.OrdinalIgnoreCase);
}
}

return false;
}

private void ValidateRequestHeader(HttpRequestMessage request)
{
string cookieToken = String.Empty;
string formToken = String.Empty;

IEnumerable<string> tokenHeaders;
if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
{
string tokenValue = tokenHeaders.FirstOrDefault();
if (!String.IsNullOrEmpty(tokenValue))
{
string[] tokens = tokenValue.Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
}
}

AntiForgery.Validate(cookieToken, formToken);
}
}

在客户端,您还需要在 ajax 调用中设置 header 。这是来自 todo.datacontext.js 的代码:

function ajaxRequest(type, url, data, dataType) { // Ajax helper
var options = {
dataType: dataType || "json",
contentType: "application/json",
cache: false,
type: type,
data: data ? data.toJson() : null
};
var antiForgeryToken = $("#antiForgeryToken").val();
if (antiForgeryToken) {
options.headers = {
'RequestVerificationToken': antiForgeryToken
}
}
return $.ajax(url, options);
}

关于asp.net-mvc - 防止针对 PUT 和删除请求的 CSRF 攻击 ASP.NET Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16089393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com