编辑- 只是一个快速的编辑,从一个明确的问题开始!我实质上要问的是,从视图发回时保护我的实体标识符的最有效方法是什么?
我一直在考虑在编辑视图模型时保护 POST 上的 ID 的方法。让我们以一个示例实体为例
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 数据。我们如何确保更新的实体是预期的?
我想我们可以验证用户是否有足够的访问权限来更新这个实体......但是如果用户的帐户被盗用,并且一些随机黑客开始使用他们的帐户注入随机 ID 怎么办?随机更新各种Post
s。
可能建议实体使用复杂的(如 GUID)标识符,这会使猜测变得更加困难,但这会使您的漂亮友好的 URL 看起来对普通用户来说有点吓人,在查看Post
for时不得不传递它例子。
我们如何在这里两全其美?保持干净的 URL,但保护我们的实体免受注入攻击?