0

私はAsp MVC 5を学習しており、このような問題に直面しています。私のために作成された足場ビジュアルスタジオを使用してコントローラとビューを更新します。私が気づいた値を編集するとき、現在のレコードを特定するために隠しを使用しています。たとえば:あなたはのdevのツールを使用してページを閲覧した場合Asp.Net MVCがデータベースの更新中に非表示になっています

http://localhost:61551/StoreManager/Edit/6

- あなたが「6」の値を持つ非表示の入力があります。ビューでは、ASPは、隠し入力

@Html.HiddenFor(model => model.AlbumId) 

を生成するコードを追加することに

<input data-val="true" data-val-number="The field AlbumId must be a number." data-val-required="The AlbumId field is required." id="AlbumId" name="AlbumId" type="hidden" value="6"> 

を見ることができる私は簡単に私が保存し、ASPの更新は完全に異なるレコードをクリックすると、その後、他の値にそれを修正することができます。ハッカーが潜在的にすべてのデータベースを簡単に破損させる可能性があります。これを防ぐ方法や、別の方法を使用する方法やそれを検証する方法はありますか?

ありがとうございます!

+0

これは、ウェブベースのアプリケーションがひどく設計されていて、セキュリティ上の欠陥に満ちている一般的な方法です。あなたは、ウェブサイトのデザインに関連するいくつかのベストプラクティスを勉強することによって最も効果的です。 –

+1

ローカルホストはマシン上にのみ存在することは知っていますが、わかりません! – Steve

+0

もちろん、私は皆さんが問題に精通しており、ライブリンクを提供する必要はないと思っていました – Vadym

答えて

3

ここでの基本的な問題は、 Webブラウザが提供します。この同じ問題は、入力が隠しフィールドを経由するかどうか、この場合と同じように、またはURL、または非隠れフィールドであるかどうかに関係なく存在します(たとえば、ドロップダウンセレクタがあるUIを想像することができますあなたが変更しようとしているデータ項目を選択する)、またはWebページ上のJavaScriptによってバックエンドに送信されたいくつかのJSONメッセージでレコードが識別されたとしても。

あなたが記述する問題は、これが隠されたフィールドであるという特定の詳細とはまったく関係がありません。また、ASP.NETを使用しているという事実とは関係がありません。 VSがアプリをスキャフォールドした方法に特有のものです。これらの詳細を変更しても、問題が発生する可能性があります。なぜなら、悪意のあるユーザーが要求の中で何かを偽造する可能性があるからです。隠されたフィールドは他の種類の入力よりも偽造するのが難しくないか簡単です。

セキュリティの観点からは、クライアントからのすべてのデータを疑わしいものとして扱う必要があります。そのような入力が有効かどうかを判断するためのルールは、アプリケーション固有であるため、これを扱うことはできません(できない)理由です。

唯一の解決策は、要求を送信したユーザーが要求していることを実行できるかどうかを判断できるようにするメカニズムを使用することです。それを達成した場合、エンドユーザが意図的にIDを変更するかどうかは重要ではありません。特定のユーザがID 6のレコードまたはID 7のレコードを編集する権限を持っている場合、6を編集して変更するそれは彼らの決定です - 彼らはレコード7を編集することを許可されており、そうすることを選択しました。彼らはそれを奇妙なやり方でやってきましたが、それは彼らの見方です。また、ユーザーが7ではなく6を編集する権限を持っていて、IDを7に変更しようとすると、サーバーは403(禁止)応答コードで要求を拒否する必要があります。

これは、ユーザーを特定するための方法が必要であることを意味します(または、少なくとも何らかの方法を知っていなければなりません。つまり、許可の内容を判断するには十分です。一部の操作では、妥当なセキュリティポリシーは、単に認証されたすべてのユーザー、または特定のセキュリティグループに属するすべてのユーザーを信頼することができます。特定の操作が特定されたユーザーに対して特定のエンティティで許可されるかどうかを判断する方法が必要です。

通常、これはユーザーログインを行うことを意味します(これにはさまざまな方法があります。アプリは何らかのシングルサインオンシステムを持つ組織内で実行される場合があります)たとえば、Google、Facebook、Azure Active Directoryなどの外部IDプロバイダに、または自分でアカウントを管理することができます。たとえば、ASP.NETはSQLサーバーのユーザーアカウントを管理することができます。そして、セキュリティポリシーが実際にどのように機能するかを決める必要があります。それは、私がexaplesを与えようとしていないオープンエンドなことです。そして、そのポリシーを実施するコードを書く必要があります。

あなたがVSから入手した基本的な足場のアプリは、あなたがそれに近づく可能性のある多くの異なる方法があるので、これをすべて行いません。それはそれの一部を行うことができます - それはあなたが望むなら、あなたがプロジェクトを作成するときにSQL Serverベースのアカウント管理を設定するか、それがAADを使うように設定することができます、または統合Windows認証によるシングルサインオン)。しかし、あなたが望むセキュリティポリシーの種類を決めることはあなたの仕事です。 「これは認証されたユーザーのみがアクセスできます」という非常に基本的なモデルが必要な場合は、コントローラに[Authorize]カスタム属性を追加できます。しかし、エンティティレベルのセキュリティ(たとえば、特定のエンティティを変更できるユーザーを決定するルールなど)が必要な場合は、そのようにするためのコードを記述する必要があります。

0

これに対処するにはいくつかの方法があります。そのような方法の1つは、User rolesを使用して、(Editのような)さまざまなメソッドにアクセスできる人を制限することです。

if (User.IsInRole("Administrators")) 
{ 
    // TODO 
} 

それとも、そうのようなAuthorize attributesを使用することができます:

[Authorize(Roles="Administrators")] 
public ActionResult Edit(Album model) 
{ 
    // TODO 
} 

また
[Authorize(Roles="Administrators")] 
public class AdminController : Controller 
{ 
    // TODO 
} 

、これらはまた、コントローラ内部の特定のメソッドに配置することができます

あなたのようなスニペットを持つことができます

これらは、広く定義されている場合誰が何にアクセスできるかについての役割はありますが、各ユーザーがログインして自分のアイテムを管理できるサービスがあるとします。あなたはまた、例えば、その項目が属する人物を表すためのモデル/テーブルにフィールドを追加することができます。:

if (albumModel.UserName == HttpContext.Current.User.Identity.Name) 
{ 
    // allow user to edit if it is his item 
} 

また、あなたはこれらを組み合わせかもしれませんどのように見ることができ、例えば管理者がユーザーのアルバムを編集できる場合は、最初にそのユーザーが管理者ロールに属しているかどうかを確認し、そうでなければこのユーザーのアルバムかどうかを確認できます。

+0

これは私の問題を100%解決しています。レスポンスありがとう! – Vadym

+0

@Vadym問題ありません。しかし、ちょうど、私はあなたが試みたと思うが、あなたは1つの答えをチェックすることしかできない。しかし、助けて幸せ。 –

+0

それは本当です。両方の答えは良いですが、残念ながら両方を選択することはできません:) – Vadym

関連する問題