即使没有明确的 [AutoValidateAntiforgeryToken],是不是也会自动添加防伪令牌?
Posted
技术标签:
【中文标题】即使没有明确的 [AutoValidateAntiforgeryToken],是不是也会自动添加防伪令牌?【英文标题】:Is anti forgery token added automatically, even without explicit [AutoValidateAntiforgeryToken]?即使没有明确的 [AutoValidateAntiforgeryToken],是否也会自动添加防伪令牌? 【发布时间】:2021-12-04 03:09:21 【问题描述】:上下文
我注意到,在 VS 2019 中从其开箱即用的模板创建新的 ASP.NET Core Razor 页面应用程序后,即使是具有 最纯粹 的 最纯粹 html 表单strong> 模型类使用<input name="__RequestVerificationToken" type="hidden" value="...">
渲染输出
问题
我是否遗漏了某些内容,并且某处有明确的属性/语句指示 ASP.NET Core 添加防伪功能,或者现在这是默认设置? (这使得使用 [AutoValidateAntiforgeryToken]
过时了)
...或...
它只是始终无条件呈现的<input name="__RequestVerificationToken" type="hidden" value="...">
,并且使用[AutoValidateAntiforgeryToken]
我可以针对它打开服务器端验证吗?这种情况下,如果验证有效,我怎么能抽测试?
示例代码
@page
@model TestFormModel
@
ViewData["Title"] = "Home page";
<div class="text-center">
<form method="post">
<input type="text" name="myinput"/>
<input type="submit" value="Submit" />
</form>
</div>
//[AutoValidateAntiforgeryToken]
public class TestFormModel : PageModel
private readonly ILogger<TestFormModel> _logger;
public TestFormModel(ILogger<TestFormModel> logger)
_logger = logger;
public void OnGet()
public void OnPost()
【问题讨论】:
【参考方案1】:在以前的 .NET Framework 版本的 ASP.NET 中,您通常必须通过属性选择加入防伪令牌。
[ValidateAntiForgeryToken]
public ActionResult Save(Product product)
db.Product.Add(product);
Return View();
在 ASPNET Core 中,它自动包含在 Form Tag Helper 中。因此,只要您的 CSHTML 包含 FORM 元素,ASPNET Core 运行时就会为您包含隐藏字段。
默认情况下包含此内容的基础是“约定优于配置”的口头禅。按照惯例,80% 以上的开发人员会选择保护他们的应用程序免受 CSRF 攻击。如果您想违反约定,可以在 Startup 类的 ConfigureServices
部分的约定帮助程序中找到选择退出的选项。
public void ConfigureServices(IServiceCollection services)
services.AddRazorPages()
.AddRazorPagesOptions(options =>
options.Conventions
.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
);
This blog post 详细介绍了 Razor 页面、选项和使用场景。
更新 - 对评论的回应
如果您阅读 a 代码,您可能会注意到没有 taghelper。 – g.pickardou
确实有一个标签助手。在新的 Razor Pages 项目模板中,您可以在此处的 _ViewImports.cshtml
文件中找到标签助手:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
我们可以验证您的 <form />
元素(如 OP 中所写)正在调用 ASP.NET 标记帮助程序,如下所示:
<form method="post">
<input type="text" name="myinput"/>
<input type="submit" value="Submit" />
</form>
如果我们在此检查页面源代码,您将看到结果
<form method="post">
<input type="text" name="myinput" />
<input type="submit" value="Submit" />
<input name="__RequestVerificationToken" type="hidden" value="token" />
</form>
现在,如果我们使用opt out of individual tag helpers的语法
<!form method="post">
<input type="text" name="myinput" />
<input type="submit" value="Submit" />
</!form>
再次检查页面源,我们可以清楚地看到我们已明确选择退出此标签助手。
<form method="post">
<input type="text" name="myinput" />
<input type="submit" value="Submit" />
</form>
【讨论】:
如果你阅读了a代码,你可能会注意到没有taghelper。 你错了。我将通过重现来更新我的答案。 你是对的,谢谢你的启发 np。我完全理解你来自哪里。有很多新功能,并且对开发人员隐藏了这些功能。不确定这是否一定是最好的。以上是关于即使没有明确的 [AutoValidateAntiforgeryToken],是不是也会自动添加防伪令牌?的主要内容,如果未能解决你的问题,请参考以下文章
在 QFormLayout 中动态创建的 QWidget 没有框架,即使明确要求这样做
即使没有明确使用事务,ACID投诉SQL数据库仍然是“ACID”吗?
linq2db 异常:“未提供配置字符串”。我没有 web/app.config,但即使我明确给出字符串,同样的异常