首页 > 解决方案 > 在 ASP.Net MVC 中删除记录的安全方法

问题描述

我想从我的 ASP.Net MVC 5 网站中删除一个产品。我想知道添加[AntiForgeryToken][Authorize]是否足以保护删除操作?

看法

 <p>Delete: @Model.Name</p>
 @using (Html.BeginForm("Delete", "ProductController", FormMethod.Post, new { ProductId = Model.ProductId }))
 {
    @Html.AntiForgeryToken()
    <button type="submit">Delete</button>
 }

控制器

[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public ActionResult Delete(long ProductId)
{
    /* Do I need to check if the logged in User has permission to delete the product?
    var product = ProductRepository.Get(Id);
    if (product.Creator == User.Identity.GetUserId<long>())
    {
        ProductRepository.Delete(ProductId);
    }
    */

    // or, can I avoid the trip to DB and just delete the record?        
    ProductRepository.Delete(ProductId); 
}

场景:黑客在我的网站上注册并创建了一个有效帐户。现在黑客查看了他自己的产品,显然他有一个 AntiForgeryToken。他现在可以在浏览器中更改 ProductId 并发布删除其他人产品的请求吗?

标签: c#asp.net-mvcasp.net-mvc-5antiforgerytoken

解决方案


简短的回答。这还不够。

防伪令牌只是说发出原始页面请求的人就是进行更新的人。

基本授权属性只是验证用户是否已登录。

您正在寻找的是数据安全性。在微软自己的网站上有一个例子。

您在上一段中所说的内容,黑客可以注册一个帐户创建他们自己的产品列表,并鉴于您在 url 中显示的内容可能会猜测合法的其他记录进行编辑

假设你有一个网址

https://example.com/product/edit/13

是什么阻止了用户/黑客猜测

https://example.com/product/edit/12https://example.com/product/edit/14

如果没有数据级别的安全性来说明用户可以或不能访问/更新的记录,您就会遇到恶意用户可以查看或编辑各种信息的情况。

这是FISERV发现暴露其他客户信息的确切场景

从文章

Hermansen 已经注册,只要有新交易发布到他的账户,就会收到电子邮件提醒,他注意到该网站为他的提醒分配了一个特定的“事件编号”。Hermansen 预感到这些事件编号可能是按顺序分配的,并且如果直接请求其他记录可能可用,Hermansen 再次请求相同的页面,但首先在浏览器中编辑了站点的代码,以便他的事件编号减少一位。


推荐阅读