私はかなり長い間私を悩ませている問題を抱えています。つまり、私は特定の組織向けのWebサイトを開発しており、市民やその他の法人による多くのデータ入力が行われる予定です。さらに言えば、ユーザーエントリと、ある種の誤動作や悪意のある使用の両方から、できる限りアプリケーションを保護したいと思います。
アイデアは次のとおりです。私はエンティティを持っています。それをEntityAと呼びましょう。これはEntityBの親です。どちらのエンティティも、データベースのデータ型(主キー)としてuniqueidentifier(GUID)を使用します。EntityBには、EntityAへの外部キーがあります。HTTP GETバージョンのCreateアクションが実行されると、次のルールがチェックされ、3つすべてが満たされる必要があります。
- アクションに渡されるIDはGuid.Emptyと等しくてはなりません(このIDはEntityA.Idの値です)
- EntityAが存在する必要があります(EntityA.Id == ID)
- EntityBは存在してはなりません(EntityAとEntityBは1対1の関係しか持てません)。
これは、ユーザーにデータ入力画面を表示するときにすべて問題ありません。私の質問は、POSTでもう一度チェックを実行する必要があるかどうかです。私に悪意のあるユーザーがいる場合、そのユーザーは、たとえばFiddlerをプロキシとして使用し、データをアプリケーションに渡す前にデータを変更することができます。したがって、上記のルールはPOSTで回避される可能性があります。上記のシナリオに対して良い戦略を持っている人はいますか?値を再度チェックする必要がありますか(同じチェックを実行するためにもう一度データベースに戻る)、またはたとえばIDをTempDataに保存し、POSTで再度アクセスして、そのIDをアクションに渡されたIDと比較する必要があります。 EntityBモデルに追加されましたか?これを行うためのより良い方法はありますか?
したがって、目標は、コードが繰り返されるのを防ぎ、安全なコードを作成することです。
編集:データベースに再度アクセスすることは避けたほうがよいでしょう。