【问题标题】:Cross-Site Request Forgery Asp.net core .cshtml pages跨站点请求伪造 Asp.net 核心 .cshtml 页面
【发布时间】:2018-11-15 10:50:18
【问题描述】:

我在我的 Web 应用程序上运行了代码质量分析工具 fortify,它在我的编辑和创建 cshtml 页面时警告我“跨站请求伪造”。

我通过实体框架模型自动生成代码来创建 asp.net core mvc web 应用程序。因此生成的表单对于 crud 操作工作正常。 我运行了应用程序,发现在 html 源代码中使用默认自动生成的代码生成了一个隐藏令牌。但是为什么质量工具会抱怨这个安全问题呢?

我尝试了以下但没有运气。我以前在我的 razor mvc 页面中添加了 AntiforgeryToken。不知道如何在 asp.net core mvc 中处理这种情况。我以为它会在不添加任何特定代码的情况下生成自动令牌。

<form asp-action="Edit" class="myForm">
            @Html.AntiForgeryToken()
<-- my form elements -->
</form>

【问题讨论】:

  • 您的工具可能报告了误报。它发生了。

标签: c# asp.net-mvc razor asp.net-core-mvc


【解决方案1】:

ASP .NET Core 2.2 仅使用指定的 POST 方法在 HTML 标记 &lt;form/&gt;(最终为 @using (Html.BeginForm(..))中自动生成防伪令牌。您的表单将被默认视为 GET 方法,因此在您的情况下不会生成防伪令牌。 ASP.NET Core 应用不会为安全的 HTTP 方法(GET、HEAD、OPTIONS 和 TRACE)生成防伪令牌。完整的解释可以在@JamieD77之前提到的文章中找到:Prevent Cross-Site Request Forgery (XSRF/CSRF) attacks in ASP.NET Core

有一些可能的情况:

  • 非 API 场景:推荐AutoValidateAntiforgeryToken。这可确保默认情况下保护不安全的 HTTP 动词(例如 POST、DELETE、PUT 和 PATCH)操作。

  • API 场景: 在这里,您还可以使用ValidateAntiForgeryToken 阻止其他操作(例如 GET 方法)。

【讨论】:

    【解决方案2】:

    尝试添加 method="post"

    <form asp-action="Edit" class="myForm" method="post">
    

    【讨论】:

    • 相信在生成令牌时,防伪的默认值为 false。这种情况下,method="get"or 被排除在外,它的 false 并且不存在操作。至少对于aspnet核心,所以method="post"asp-antiforgery="true"(标签助手)然后你会在响应头&lt;form asp-antiforgery="true" … &gt;&lt;/form&gt;中得到一个__RequestVerificationToken
    • 所以我们需要 post 和 asp-antiforgery="true" 两种方法?还是仅仅方法 =post 就足够了?
    • @Kurkula 抱歉,是的,您可以同时使用这两种方法,但在更高版本的 .net 核心中不需要。 docs.microsoft.com/en-us/aspnet/core/security/…
    猜你喜欢
    • 2013-02-28
    • 2014-08-31
    • 2014-06-21
    • 1970-01-01
    • 2021-10-17
    • 2018-04-25
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多