【问题标题】:Is Delete Action Method without AntiForgeryToken unsafe in ASP.NET MVC?没有 AntiForgeryToken 的删除操作方法在 ASP.NET MVC 中不安全吗?
【发布时间】:2016-04-17 20:58:20
【问题描述】:

我的一个视图中有一个网格,并在其中创建了一个操作列。该列中有用于编辑和删除的按钮。当用户单击删除按钮时,我使用 jQuery 访问其单击事件。

这是我的 ajax 删除的样子:

    $(document).on('click', '.btnDeleteRole', function (e) {
        e.preventDefault();
        if (confirm("Are you sure you want to delete this record?")) {
            var $this = $(this); //store $(this) to a variable
            var roleId = $this.attr('data-role-Id');

            $.ajax({
                type: "POST",
                url: "/admin/roles/delete",
                data: { id: roleId },
                dataType: "html",
                success: function (data) {
                    // rebind kendo grid
                }
            });
        }
    });

这是我的删除操作方法的样子:

// POST: Roles/Delete/5
[Route("roles/delete")]
[HttpPost]
public async Task<IActionResult> RoleDelete(string id)
{
    IdentityRole role = await _roleManager.FindByIdAsync(id);
    await _roleManager.DeleteAsync(role);
    return RedirectToAction("RoleIndex");
}

由于删除按钮不是表单的一部分,因此我的 ActionMethod 上方不能有 AntiForgeryToken 注释。

删除这样的项目安全吗?

【问题讨论】:

  • 需要通过JS传递token。
  • 我的网格中的每一行真的需要一个标记吗?那么我不需要将每个项目包装在一个表格中吗?
  • 可以使用单个token,只要JS能拿到就行。

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


【解决方案1】:

不,这不安全。如果您不使用 antiforgerytoken,您将面临 CSRF 攻击,如 here 所述。

您只需要在您的网格删除帖子中发送主表单隐藏令牌。您不需要每行一个令牌,因为您拥有表单的隐藏令牌和 cookie 的令牌,这就是您所需要的。

【讨论】:

  • 如果我的视图只有一个产品网格列表怎么办。我是否只是创建一个带有防伪令牌的空表单?你能告诉我如何通过js访问它吗?
  • @BlakeRivell 如果通过 Ajax 发送令牌,您只需要 @Html.AntiForgeryToken() 而不是表单。如果您发布 Json 而不是表单,请阅读有关 Ajax 请求的更多详细信息的链接
猜你喜欢
  • 1970-01-01
  • 2018-05-27
  • 2012-03-29
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多