gpt4 book ai didi

c# - ValidateAntiForgeryToken 是否可以防止伪造 POST 参数?

转载 作者:行者123 更新时间:2023-11-30 21:52:24 27 4
gpt4 key购买 nike

我有点理解[ValidateAntiForgeryToken] 是如何防止 CSRF 的,我已经通读了 this question ,但我不确定这是否会阻止某人伪造表单帖子的参数。

ItemList 有一个 Items 属性,它是项目的集合,还有一个 User 属性,它是对 ApplicationUser< 的引用 它属于。 Item 有一个 ItemList 属性,它是对其所属列表的引用。以下是 ItemController 中的 Add 方法:

// GET: Item/Add/4 (Adds new Item to the ItemList with ID=4)
public ActionResult Add(int? itemListId)
{
// Gets the current user and the ItemList that the Item will be added to
UserManager<ApplicationUser> userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
ApplicationUser currentUser = userManager.FindById(User.Identity.GetUserId());
ItemList itemList = db.ItemLists.Find(itemListId);

// Makes sure that ItemList exists and belongs to the user
if (itemList == null || itemList.User != currentUser)
{
return View("InsufficientPerm");
}
ViewBag.ItemListId = itemListId;
return View();
}

// POST: Item/Add/4 (Adds new Item to the ItemList with ID=4)
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Add([Bind(Include = "ID,Name")] Item item, int? itemListId)
{
if (ModelState.IsValid)
{
ItemList itemList = db.ItemLists.Find(itemListId);

item.ItemList = itemList;
db.Items.Add(item);
itemList.Items.Add(item);
db.SaveChanges();

return RedirectToAction("Index");
}
return View(item);
}

我的问题是 [ValidateAntiForgeryToken] 是否会阻止用户在发布期间伪造 itemListId 参数,或者我是否需要放置另一个 if ( itemList == null... 检查 post 方法。

编辑:这是我现在正在查看的逻辑:

  • ValidateAntiForgeryToken 的使用强制用户访问第一个方法(因此加载 View )以便接受帖子。如果他们不加载该 View ,则不会有防伪 token 。
  • 用户将转到表单网页(比方说http://foo.bar/Item/Add/3)
  • 用户将填写并提交表单,这将调用 post 方法(在本例中为 itemListId=3,因为这是被访问的网页)
  • 用户无法将不同的 itemListId 传递给上述步骤,因为它是在提交表单时由网页传递的

现在,请让我知道我上面所说的是否有问题,或者逻辑是否正确(这意味着我不需要在发布期间检查 itemListId 的有效性)。 请举例说明我的逻辑哪里不对

最佳答案

There is no way for a user to pass a different itemListId to the above step, because it is passed by the webpage when they submit the form

这是错误的。 AntiForgeryToken 不会保护您免受更改的数据。

  1. Item/Add/4 发出 GET 请求.我假设您将在此页面上有一个表格。您可以包括 @Html.AntiForgeryToken() .

  2. 使用浏览器的调试工具检查表单。

    • 现在您可以编辑 action属性直接修改Item/Add/5值(value)。
    • 或修改任何<input>字段值。
  3. 对您的 POST 操作进行调试中断,您将在提交表单时看到更改后的值。

以上并不是篡改数据的唯一方法。因此,您应该始终验证任何输入。

[Authorize, ValidateAntiForgeryToken]
[HttpPost]
public ActionResult NukeMyBankAccount(int accountId)
{
var account = db.GetAccount(accountId);

// validate
if (CurrentUser.Id != account.Owner.Id)
{
return RedirectToAction("Unauthorized");
}
else
{
db.NukeAccount(accountId, areYouSure: true);
}
...
}

关于c# - ValidateAntiForgeryToken 是否可以防止伪造 POST 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34801934/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com