2012-03-07 9 views
3

私は本当にこれで混乱しています...まだ。MVCで[バインド(Exclude = "ID")]を理解できません

私は以前これと同様の質問をしていましたが、今はもっと簡単に質問します。

これは多くのサンプルとチュートリアルで確認できます。どのように[Bind(Exclude = "ID")]をモデル全体に​​置くことができ、モデルの編集を行うことができますか? POSTではモデルのすべてのプロパティをパックするがIDはパックしないと、編集するIDはどのように分かりますか?

ViewModelsを使用していても、おそらくIDなしで作成しています。だからその場合...また、どのIDが編集で更新されたのか分かりますか?

はい、これには「セキュリティ」要素があることを理解しています。人々はIDをハイジャックすることができるので、POST中に人々が値を更新しないようにする必要があります。しかし、編集を正しく処理する方法は何ですか?よくあることは何ですか?

私は非常に些細なものを欠いているように感じる。

答えて

3

MVCリクエストは、クライアントが要求するときにモデルバインダーによって処理されます。あなたのコントローラにモデルを含めるならば、私が知っている限り、実際にバインドするモデルを指定する必要があります(モデルに1つの引数しかない場合を除く)

SomeModel_ID 

特定のプロパティがセキュリティリスクを引き起こすため、バインドされないようにすることができます。これは概念としては幸せそうです。モデルのIDを除外し、クライアントからのリクエストでこの値をプレーンテキストで送信しないようにします。

ここで、モデル全体を除外する理由は何ですか?まあ、すべてのコントローラー引数がモデルバインダーであらかじめ処理されているわけではありません。たとえば、RedirectToActionはモデルバインダーを通過しないため、この例では、POSTコントローラーアクションで新しいモデルを作成し、GETコントローラーアクションにリダイレクトして、サニタイズモデルを渡すことが考えられます。そのモデルはクライアントによって実装されることはできませんが、サーバー側で自由にモデルを作成できます。

私がモデルにバインドする唯一の時間は、そのモデルのビューモデルと関連するエディタがある場合です。これにより、共通のエディタをページに挿入し、それらのプロパティをカプセル化することが非常に簡単になります。特定のプロパティをバインドから除外しなければならない場合、私はあなたが間違っていると主張します。あなたのコメントに続いて

アップデートは私はあなたが混同される可能性がありますなぜ私が見ることができると思います。モデルバインドエクスクルーダは、クライアントがモデルプロパティを設定することを禁止します。更新を行うためにこのプロパティが必要な場合は、単純に除外できません。これが意味することは、ユーザーがIDをポストバックする可能性があるということです。この場合、要求された更新を処理する前に、このIDに関連付けられているオブジェクトまたはデータベースレコードを変更する権限がユーザーにあることを確認する必要があります。 引数の検証は手動のプロセスです。入力を検証するためにデータアノテーションを使用できますが、これはアクセス許可にはあまり役立ちません。これは、手動で何らかの段階で確認する必要があるものです。

+0

はい、モデル上でIDを除外していますので、「クライアント要求がこの値をプレーンテキストで指定しないようにする」を除外しています。だから、今更新するレコードはどうやって分かるの?レコードを更新したい場合は、どのようにしてポスト中のIDをハイジャック不可能な方法で渡すことができますか? –

+1

あなたはしません。不正な値を返信することを防ぐためのものではありません。これはバイナリ条件です。あなたはそれを転記することが許されるか、そうではありません。 IDをポストバックする必要がある場合は、コントローラでチェックするのはあなたの責任であり、明らかに投稿を許可する必要があります。 –

+0

つまり、言い換えれば...私が編集をしている場合、IDでバインド除外をしてはいけません。代わりに、IDを更新する前にログインしているユーザーに属しているかどうかを確認するか、HttpGet中にセッションに貼り付け、HttpPostで比較して同じIDを確認してください。私は正しく考えていますか? –

2

あなたはページアドレスを通じてあなたに渡されているので、あなたはIDを知っています。したがって:

http://yoursite.com/admin/users/edit/20 

IDパラメータには20が入力されます。 POSTで使用されている場合(つまり情報が入力されている場合)、IDフィールドを手動で入力して、あなたが考案した方法でデータベースコントローラに渡します。

これはまた、20のほかに他のIDを書き込むとID 20でユーザーを更新しないため、(些細な)ハイジャックに対しても影響を受けません。 :)

+0

これはどのように免疫が見られないのですか?レコード20を編集するためにHttpGetをやり直すことができます。その後、20を21に変更する以外は同じURLにHttpPostを実行できます。今度は別のレコードを更新しましたか? –

+1

はい、あなたは何かを迂回していません。手動で21を開いて更新したようなものです。 – Blindy

関連する問題