2009-04-13 11 views
21

、私は顧客を編集するためのフォームとビューを返すために、次のようにURLを使用したい:ASP.NET MVCの隠しフォームフィールドよりも安全なものは何ですか? ASP.NET MVC(デフォルトのルーティング)では

/Customers/Edit/5 

私はCustomerId=5を利用するために必要がありますが、私は今、私が使用してIDを非表示にするit.Rightを変更するために顧客を許可したくない:これは私が欲しいものを達成し

<%= Html.Hidden("CustomerId") %> 

が、私は、隠しフォーム変数が確保されていないという印象の下だと、エンドユーザが操作することができます。

お客様が情報を編集でき、IDは編集できないようにするにはどうすればよいですか?

答えて

12

に応じて私のソリューションは、Steven Sanderson's ASP.NET MVC bookからタンパープルーフコードを使用することでした。スティーブンのコードは、その後のCustomerIdの別のハッシュを計算し、それがCustomerIdHashに等しい一定になり、フォームが送信されると

<%= Html.Hidden("CustomerId") %> 
<%= Html.Hidden("CustomerIdHash") %> 

:アイデアは、あなたが証拠を改ざんしたい任意の非表示のフォームフィールドのハッシュを作成することです。そうであれば、改ざんは発生していない。それは素晴らしいコードであり、本の価格に見合う価値があります。

+4

ハッシュを塩分けしてください。そうでないと何も得られませんでした! (私は本がこれについて詳しく説明していると確信しています) – teedyay

+0

また、モデルを送信するのではなく、ハッシュされた入力フィールドで比較を実行できるように、FormCollectionをポストメソッドにパラメータとして送信する必要があると仮定していますpostメソッドに渡します。オプションで、モデルに安全なフィールドを追加して、ハッシュ値を返信してモデルにバインドすることもできます。 – Matt

6

ブラウザ側では本当のセキュリティはありません。顧客IDはクエリ文字列に入れることができますが、サーバーは実際にその顧客を編集することが許可されているかどうかを検証する必要があります。そうでない場合は、エラーを返します。

10

対応するビューを表示する前に、コントローラアクション(/ Customers/Edit)のアクセス許可を確認してください。ここで問題となっているのは、非表示のフィールドではありません。ユーザーはブラウザに「http://yoursite.com/Customers/Edit/10」と入力するだけです。したがって、アクションをどのように呼び出すかにかかわらず、ユーザーがリクエストされた顧客の詳細を実際に編集できるかどうか、アクションをチェックインする必要があります。

+1

許可されたユーザーだけが特定のIDのビューを表示できるようにコントローラのアクションを構成する方法を参照しますが、ユーザーがそのIDを変更できないようにする方法はわかりません。たとえば、ユーザーは/ Customers/Edit/10を表示する権限がありますが、フォームを送信するときにIDを変更し、最初に表示する権限がないIDを編集することができます(例:/ Customers/Edit/11)。私は、IDが最初に送られたものであることを確認するために、提出されたフォームをチェックする必要があると思います。 – royco

+1

現在ログインしているユーザーに、要求されたIDを表示/編集する権限があることを確認する必要があります。あなたのコントローラーアクションでは、ユーザー名(たとえばThread.CurrentPrincipal.Identity.Nameを使用して)を取得し、このユーザーが彼がやろうとすることを許可されているかどうかを確認します(要求されたアクションに応じて表示または編集します)。したがって、ユーザーがIDを変更すると、彼はまだ彼が許可されていないものを表示することはできません。実際には、IDを変更しようとすることさえも理由がありません。 –

1

2つの側面があります。

  • すべてのユーザーについて、すべての顧客を編集することができない場合があります。したがって、ドミトリーが示唆するように、フォームのポストのコントローラアクションは、編集しようとしている顧客を見て、ログインしたユーザーが実際にその顧客を編集できることを確認する必要があります。また、最初に編集フォームを生成するコントローラアクションで同様のチェックを行い、要求された顧客を編集することが許可されていない場合でもフォームにアクセスさせないようにすることもできます。
  • 特定のユーザーと特定の顧客について、ユーザーが顧客IDを変更できないようにすることはおそらくありません。 POSTコントローラアクションでUpdateModelメソッドを使用している場合は、プロパティwhitelistパラメータを使用し、IDプロパティを除外して、ユーザーがIDを変更しないようにする必要があります。隠しフィールドの値を変更しても、変更された値はホワイトリストを介してUpdateModelによって無視されます。
2

私は同じ問題を抱えています。私はその解決策に代理キーの使用が関係していると考えています。 ID列がある各テーブルでは、Guid(SQLサーバーの一意識別子)であるKey列も追加します。今、ジョインや内部ロジックを行うときに私はIDを使用しますが、コントローラはすべてキーを使用します。それはGuidなので、別のレコードのGuidが何であるかを推測するのは難しいです。

代わりに(または上記に加えて)あなたが隠しフィールドを暗号化することができThis article

3

改ざんされていない隠しフィールドは、すべてうまくいいですが、それでもまだわかりにくいセキュリティです。コントローラーとアクションを確保することによって、Webサイト、具体的にはMVCを保護することが常にベストです。その後、ユーザーは自分が望むすべてのものを改ざんすることができ、どこにも行かない。