編集- 簡単な編集です。明確な質問から始めましょう。私が本質的に求めているのは、ビューからポストバックするときにエンティティ識別子を保護する最も効果的な方法は何ですか?
ビューモデルを編集するときに 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
の をランダムに更新します。
複雑な (GUID のような) 識別子を持つことは、エンティティに対して推奨される可能性が高く、推測Post
が非常に難しくなりますが、これにより、平均的なユーザーにとっては見栄えのするフレンドリーな URL が少し威圧的に見えます。例。
ここで両方の長所を活かすにはどうすればよいでしょうか。きれいな URL を維持しながら、エンティティをインジェクション攻撃から保護しますか?