即使没有显式 [AutoValidateAntiforgeryToken],是否会自动添加防伪标记?
Is anti forgery token added automatically, even without explicit [AutoValidateAntiforgeryToken]?
上下文
我注意到,在 VS 2019 中从开箱即用的模板创建新的 ASP.NET Core Razor 页面应用程序后,即使是 purest html 形式与 最纯粹的 模型 class 渲染输出与 <input name="__RequestVerificationToken" type="hidden" value="...">
问题
我是不是遗漏了什么,某处有明确的 attribute/statement 指示 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()
{
}
}
以前在 ASP.NET 的 .NET Framework 版本中,您必须选择加入通常带有属性的防伪令牌。
[ValidateAntiForgeryToken]
public ActionResult Save(Product product)
{
db.Product.Add(product);
Return View();
}
在 ASPNET Core 中,这会自动包含在 Form Tag Helper 中。因此,只要您的 CSHTML 包含 FORM 元素,ASPNET Core 运行时就会包含隐藏字段。
默认包含这个的基础是“约定优于配置”的口头禅。按照惯例,80% 以上的开发人员会选择保护他们的应用程序免受 CSRF 攻击。如果你想违反惯例,你可以在 Startup class.
的 ConfigureServices
部分的惯例助手中找到选择退出的选项。
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages()
.AddRazorPagesOptions(options =>
{
options.Conventions
.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
});
}
This blog post 进一步详细介绍了 Razor 页面、选项和使用场景。
更新 - 对评论的回应
If you read the a code, you may notice that there is no 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>
上下文
我注意到,在 VS 2019 中从开箱即用的模板创建新的 ASP.NET Core Razor 页面应用程序后,即使是 purest html 形式与 最纯粹的 模型 class 渲染输出与 <input name="__RequestVerificationToken" type="hidden" value="...">
问题
我是不是遗漏了什么,某处有明确的 attribute/statement 指示 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()
{
}
}
以前在 ASP.NET 的 .NET Framework 版本中,您必须选择加入通常带有属性的防伪令牌。
[ValidateAntiForgeryToken]
public ActionResult Save(Product product)
{
db.Product.Add(product);
Return View();
}
在 ASPNET Core 中,这会自动包含在 Form Tag Helper 中。因此,只要您的 CSHTML 包含 FORM 元素,ASPNET Core 运行时就会包含隐藏字段。
默认包含这个的基础是“约定优于配置”的口头禅。按照惯例,80% 以上的开发人员会选择保护他们的应用程序免受 CSRF 攻击。如果你想违反惯例,你可以在 Startup class.
的ConfigureServices
部分的惯例助手中找到选择退出的选项。
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages()
.AddRazorPagesOptions(options =>
{
options.Conventions
.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
});
}
This blog post 进一步详细介绍了 Razor 页面、选项和使用场景。
更新 - 对评论的回应
If you read the a code, you may notice that there is no 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>