ここでの基本的な問題は、 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]
カスタム属性を追加できます。しかし、エンティティレベルのセキュリティ(たとえば、特定のエンティティを変更できるユーザーを決定するルールなど)が必要な場合は、そのようにするためのコードを記述する必要があります。
これは、ウェブベースのアプリケーションがひどく設計されていて、セキュリティ上の欠陥に満ちている一般的な方法です。あなたは、ウェブサイトのデザインに関連するいくつかのベストプラクティスを勉強することによって最も効果的です。 –
ローカルホストはマシン上にのみ存在することは知っていますが、わかりません! – Steve
もちろん、私は皆さんが問題に精通しており、ライブリンクを提供する必要はないと思っていました – Vadym