雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

ASP.NET Core MVC/RazorPage使用Anti-Forgery Tokens进行XSRF/CSRF防护

2024-10-13 41

ASP.NET Web Stack运行时使用同步器令牌模式的变体来抵御XSRF攻击。同步器令牌模式的一般形式是,除了身份验证令牌):一个令牌作为Cookie,另一个作为表单值,两个反XSRF令牌提交到服务器。服务器在两个令牌通过比较检查时才允许请求继续。

如果使用RazorPage的视图默认是打开Anti-Forgery反XSRF验证的。使用MVC的话需要手动打开Anti-Forgery反XSRF验证。

视图中生成令牌

在MVC视图或Razor页面调用@Html.AntiForgeryToken方法。

<form method="post">
    @Html.AntiForgeryToken()
    <input type="hidden" name="name" />
    <input type="submit" value="submit" />
</form>

或者使用TagHelper标签

加入@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers后,默认打开验证,如果要关闭可以在标签上设置asp-antiforgery="false"

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<form method="post" asp-antiforgery="true">
    <input type="hidden" name="name" />
    <input type="submit" value="submit" />
</form>

它们都会在生成的Html里输出一个隐藏的input

<input name="__RequestVerificationToken" type="hidden" value="CfDJ8D2AldnKCKtPu-yHYNyGFgLsK_rsu1jw-Oec7ad8nTOZGciIwSsGqc1_OLIxalzQDTOs3Howk-w1hq9JJx0SpU5Q_qjAWNjIbB1F52PnyDgSTaxQVWWj7_tP6doLk3ITWctN7Kg6Vz-yiXDW_Q2Tn4U" /></form>

服务端验证Token令牌

在控制器上使用ValidateAntiForgeryToken属性

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Index(object obj)
{
    
}

或者使用ValidateRequestAsync方法验证令牌。

try
{
    await _antiforgery.ValidateRequestAsync(HttpContext);
}
catch (Exception ex) {
    // HttpAntiForgeryException
}

如果验证成功,则允许请求继续。 如果验证失败,框架将引发 HttpAntiForgeryException。

The required antiforgery request token was not provided in either form field \"__RequestVerificationToken\" or header value \"RequestVerificationToken\".

更新于:1个月前
赞一波!

文章评论

评论问答