c# - 在 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 并发布删除其他人产品的请求吗?
解决方案
简短的回答。这还不够。
防伪令牌只是说发出原始页面请求的人就是进行更新的人。
基本授权属性只是验证用户是否已登录。
您正在寻找的是数据安全性。在微软自己的网站上有一个例子。
您在上一段中所说的内容,黑客可以注册一个帐户创建他们自己的产品列表,并鉴于您在 url 中显示的内容可能会猜测合法的其他记录进行编辑
假设你有一个网址
https://example.com/product/edit/13
是什么阻止了用户/黑客猜测
https://example.com/product/edit/12 或 https://example.com/product/edit/14
如果没有数据级别的安全性来说明用户可以或不能访问/更新的记录,您就会遇到恶意用户可以查看或编辑各种信息的情况。
这是FISERV发现暴露其他客户信息的确切场景
从文章
Hermansen 已经注册,只要有新交易发布到他的账户,就会收到电子邮件提醒,他注意到该网站为他的提醒分配了一个特定的“事件编号”。Hermansen 预感到这些事件编号可能是按顺序分配的,并且如果直接请求其他记录可能可用,Hermansen 再次请求相同的页面,但首先在浏览器中编辑了站点的代码,以便他的事件编号减少一位。
推荐阅读
- vba - Access 允许在子表单的某些列中添加但不允许编辑
- javascript - 如果单词包含特定字母的组合,则将整个单词包含在 span 元素中
- postgresql - 从 WSL 2 连接到 Postgresql 的现有实例
- ubuntu - 无法安装 nginx-module-image-filter
- java - 在 ActionEvent JButton 主体中无法访问 int 变量值
- sqlalchemy - SQLalchemy 选择列和 COUNT(column)
- azure - Azure 发布管道中未填充订阅
- javascript - 对象字面量的属性“bedRooms”隐含地具有“任何”类型。错误打字稿
- matlab-figure - 在 MATLAB 中围绕向量绘制 3D 圆形箭头
- android - 多次调用 Root Widget MaterialApp