【问题标题】:Secure way to Delete a record in ASP.Net MVC在 ASP.Net MVC 中删除记录的安全方法
【发布时间】:2018-08-30 13:35:30
【问题描述】:

我想从我的 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-mvc asp.net-mvc-5 antiforgerytoken


    【解决方案1】:

    简短的回答。这还不够。

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

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

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

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

    假设你有一个网址

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

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

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

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

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

    来自文章

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

    【讨论】:

    • 非常感谢@Fran。因此,如果我执行第一种方法(检查 Product.Creator)就足够了吗?
    • 这取决于您的情况。如果用户只能编辑他/她的记录,那么可以。您可能有一个人可以委托其他用户访问的场景。您可能有一位经理可以查看其直接员工的所有记录。对此没有标准答案。
    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多