Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NETMVC中删除记录的安全方法_C#_Asp.net Mvc_Asp.net Mvc 5_Antiforgerytoken - Fatal编程技术网

C# 在ASP.NETMVC中删除记录的安全方法

C# 在ASP.NETMVC中删除记录的安全方法,c#,asp.net-mvc,asp.net-mvc-5,antiforgerytoken,C#,Asp.net Mvc,Asp.net Mvc 5,Antiforgerytoken,我想从我的ASP.NETMVC5网站上删除一个产品。我想知道添加[AntiForgeryToken]和[Authorize]是否足以确保删除操作的安全 查看 <p>Delete: @Model.Name</p> @using (Html.BeginForm("Delete", "ProductController", FormMethod.Post, new { ProductId = Model.ProductId })) { @Html.AntiForg

我想从我的ASP.NETMVC5网站上删除一个产品。我想知道添加
[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>
 }
删除:@Model.Name

@使用(Html.BeginForm(“Delete”,“ProductController”,FormMethod.Post,new{ProductId=Model.ProductId})) { @Html.AntiForgeryToken() 删除 }
控制器

[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); 
}
[HttpPost]
[授权]
[ValidateAntiForgeryToken]
公共操作结果删除(长ProductId)
{
/*我是否需要检查登录用户是否具有删除产品的权限?
var product=ProductRepository.Get(Id);
if(product.Creator==User.Identity.GetUserId())
{
ProductRepository.Delete(ProductId);
}
*/
//或者,我可以避免去DB而直接删除记录吗?
ProductRepository.Delete(ProductId);
}

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

简短的回答。这还不够

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

基本authorize属性只是验证用户是否已登录

您需要的是数据安全性。在微软自己的网站上有一个这样的例子

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

假设你有一个url

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

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

这正是我们发现的公开其他客户端信息的场景

从文章中

Hermansen已经注册,可以在任何时候收到新交易的电子邮件提醒 发布到他的帐户,他注意到网站为他分配了一个警报 具体的“事件编号”。凭直觉判断这些事件编号 可能按顺序分配,而其他记录可能 如果直接请求,可用,Hermansen请求相同的页面 再次但首先在他的浏览器中编辑网站的代码,以便 事件编号减少了一位数


非常感谢@Fran。所以,如果我使用第一种方法(检查Product.Creator),那么就足够了?这取决于您的场景。如果用户只能编辑其记录,则为“是”。您可能会遇到这样的场景:一个人可以将访问权限委托给另一个用户。您可能有一位经理,可以查看其直接员工的所有记录。这个问题没有标准答案。