编辑 -只是一个快速编辑,用一个清晰的问题开始这一关! 什么,我基本上是问的是,什么是发布从视图中回来时,保护我的实体标识符的最有效方法是什么?
我一直在思考如何编辑视图模型时保护ID上POST。 让我们举个例子实体
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}
而其对应的视图模型:
public class PostViewModel
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}
现在,当我通过这个视图模型的观点,即允许用户编辑它,我会做这样的事情:
public ActionResult EditPost(PostViewModel viewModel)
{
Post post = database.Posts.Single(p => p.Id.Equals(viewModel.Id));
post.Title = viewModel.Title;
post.Content = viewModel.Content;
database.Entry(post).State = System.Data.EntityState.Modified;
database.SaveChanges();
return View(viewModel);
}
或者,也许通过参数表像这样通过ID:
public ActionResult EditPost(int postId, PostViewModel viewModel)
{
Post post = database.Posts.Single(p => p.Id.Equals(postId));
// and the rest
}
无论哪种方式,我们需要返回的标识符,我们正在与POST数据更新沿实体。 我们如何确保更新的实体是一个预期?
我想我们可以验证用户是否具有足够的权限来更新这个实体...但如果用户的账户被泄露,以及一些随机的黑客开始使用他们的账户注入随机编号? 更新各种Post
随机秒。
具有复杂(如GUID)标识符可能推荐的实体,这将使猜测了很多困难,但是这会是你的好和友好的URL看起来有点吓人的普通用户来说,具有查看时,围绕通过Post
例如。
我们如何获得两全其美吗? 保持清洁的网址,但保护我们的实体从注入攻击?
这是直接引用攻击,并根据oswap建议,您可以
- 通过交换其为一个GUID,然后保持在存储器/会话映射混淆ID
- 在举行会议的项目的引用,并确保它是相同的是回来
我解决这个的方法是用一个属性,我没有任何代码手,所以你需要像
Decorate get action with attribute
on gets, attribute clears item list from session
Pull Item from db
store items id in session for item
decorate post action with attribute
attribute makes sure modelstate is valid first (saves double validating)
attribute looks in session for id
attribute checks the id against the stored value
if id matches, action can continue
if id doesn't match, an entry is made in modelstate
使用这种methodolgy的,你可以保护自己免受别人的工具与您的IDS摆弄像burpsuite或使用浏览器的控制台模式翻转隐藏字段。
同时,作为首发这个过程中,始终确保您获取项犯规盲目地从数据库获取,但首先确保人居然能拿到项目,即。 属于自己的数据集,等等等等
你说的是从黑客的形式说,他们正在更新记录2他们应该被编辑记录1,权当有人饲养? 并不见得防止人们搞清楚一个职位由用户ABC为1的身份?
也许这将是一个有点简单的创建表和视图模型既标识列和一个GUID。 所有网址/ GET过程可以利用周围的身份来构建,你可以完成所有的后期处理与GUID的。 这将让你不必建立一些内存映射,使用会话密钥,创建动作过滤器等,我很喜欢你 - 我想,以减少你对会议的依赖性的量,因为它是对时间敏感的; 一旦你的会话过期,你保存在内存中的映射过期所以它总是会返回一个假阴性。
这可能虽然消除了数据层的一些可重复使用性。
编辑:但我认为最好的保护就是像你说的 - 验证该编辑记录的帐户可以访问编辑的记录。 如果您结合起来,与一个GUID(或某事的形式加密),这将使它很难在随机猜测的记录。
你也可以尝试加入某种散列算法的POST形式。 喜欢的东西,凑身份,谁创造的职位,创建职位时的时间,也许一些随机不可更新的盐对最终用户无法看到实体的用户。 您可能还包括一些随机的(如在当页面被渲染蜱的时间),以确保哈希值是唯一的每次页面加载,这将防止有人从农业的GUID /哈希(你将需要发布在蜱单独的字段)如果帐户被攻破。 您的验证过程将匹配在POST'ed与实体那些相同的字段的散列且仅当哈希匹配执行更新哈希值。 但是,这似乎有点小题大做了我。
文章来源: Most effective method of protecting an entity ID when posting back from a view