2009-04-12 17 views
9

URL操作を防ぐための優れた戦略、コードスニペットなどはありますか?MVCでのURL操作攻撃の防止?

たとえば、私はこのURLを持っています。http://localhost/profile/edit/5 idは簡単に何かに変更することができるので、人々はそれも想定されていないプロファイルを編集することができます。 - キーを推測することはほとんど不可能 - しかし、人々はまだ取ることができます

  1. GUID主キーを使用するように私のシステムを変更し

    :ここ

    は、私は考えますが、それらはすべてそこに欠点を持っているいくつかのアイデアがありますアプリケーションの一部からGUIDを取り出し、後で別のURLで使用します。

  2. キーを保存するためにTempDataを使用すると、URLの後に\ のURLが送信されるのを防ぐことができます。

  3. は、ページを表示する前に、コントローラにチェックを実行 - あなたが操作を確認するためにどこでも 「をadminy」のコードを実行する必要があり を意味します。

どうすればよいですか?これらの1つまたは何か他のもの?

+0

私は追加したかった、これを行うにはまともな方法はまだありますか?おそらくEntityFrameworkで? – Worthy7

答えて

17

3番は正しいことです。サーバー側のセキュリティ検証は、完全に制御して信頼できるメカニズムであるため、常に必要なものです。

1番はセキュリティで保護されていて、誰かが間違って自分のURLをどこかに投稿した場合(「リンク」のコピー/貼り付け時にセッションIDを使用することが多い)

数字2は弱いセキュリティのようです - あなたが面倒を見るなら、適切なセキュリティを実装してください。これにより、人々はページをブックマークすることもできます。

+0

合意。 MVCには、デフォルトでアカウント作成ページが付属しています。 –

+3

異なるコントローラ/アクションにアスペクトとしてセキュリティを適用できるようにする属性を実装することで、(3)をさらに簡単にすることができます。どのように私はそれについての詳細については、この質問への私の応答を参照してください。 – tvanfosson

1

あなたのサイトにアクセスするために使用されるURLは、クライアントからのデータであり、セキュリティに関しては、常にクライアントから提供されたデータが敵対的であると考えるべきです。

残念ながら、この問題に対処するための銀色の弾丸はありません。アプリケーション全体でアクセス制限を実装する必要があります。

3

基本的な機能を保護するために、URLを「操作上の保護」にしないでください。それ以外にも、ほとんどのウェブサイトではURLをよりわかりやすく表示させるために、例えばhttp://stackoverflow.com/questions/741653/preventing-url-manipulation-attacks-with-mvcのように - 難読化は後ろ向きになります。

コントローラ内の権限をチェックし、ユーザがプロファイル6を編集できない場合は例外を発生させます。「チェック」をどこにも置いたくない場合は、ActionFilterに入れることもできます。 Profile.FindById(id)ではなく、CurrentUser.FindProfileToEditById(profileId)(アクションが許可されていない場合は例外をスローする)のようなヘルパーメソッドをいくつか作成します。

"現在のユーザー"がいない一般的なサービスが必要な場合は、GUID(例:Doodleなど)を使用することもできますが、これは常にさまざまな方法でセキュリティ上の脅威になります彼らの写真アルバムの問題)。

3

カスタム認可フィルタを使用して、ロールベースおよび所有者ベースのアクセス制御を実装します。標準のAuthorizationFilterでは、アクションにアクセスできる名前付きロールまたはユーザーを指定できます。これを拡張して、データの「所有者」であれば、現在のユーザーがアクセスできるように指定することができます。RoleOrOwnerAuthorizationFilterとRoleOrOwnerAssociatedAuthorizationFilterの2つの追加フィルタがあります。最初に、RouteDataで渡される設定可能なパラメータ(通常はid)が、ユーザテーブル内の現在のユーザのIDか、または現在のユーザがリストされているロールのいずれかにあるかどうかがチェックされます。そうであれば、検査は成功し、そうでなければ、認証エラー・ビューを返す。

2番目の方法では、ジョインテーブルと、RouteDataのパラメータをジョインテーブルのカラムに関連付け、現在のユーザをジョインテーブルの別のカラムに関連付けるためのパラメータを指定できます。パラメータ値とユーザの両方に一致するエントリがある場合、私はユーザがデータに関連しており、アクセス可能であると結論づけます。また、指定されたロールに属している場合は、アクセスを許可します。 3つの異なる属性の間で、アクセス制御のニーズはほぼすべて満たされています。つまり、適切に構成された属性を装飾するだけでセキュリティを適用します。

関連する問題