0

私はかなり長い間私を悩ませている問題を抱えています。つまり、私は特定の組織向けのWebサイトを開発しており、市民やその他の法人による多くのデータ入力が行われる予定です。さらに言えば、ユーザーエントリと、ある種の誤動作や悪意のある使用の両方から、できる限りアプリケーションを保護したいと思います。

アイデアは次のとおりです。私はエンティティを持っています。それをEntityAと呼びましょう。これはEntityBの親です。どちらのエンティティも、データベースのデータ型(主キー)としてuniqueidentifier(GUID)を使用します。EntityBには、EntityAへの外部キーがあります。HTTP GETバージョンのCreateアクションが実行されると、次のルールがチェックされ、3つすべてが満たされる必要があります。

  1. アクションに渡されるIDはGuid.Emptyと等しくてはなりません(このIDはEntityA.Idの値です)
  2. EntityAが存在する必要があります(EntityA.Id == ID)
  3. EntityBは存在してはなりません(EntityAとEntityBは1対1の関係しか持てません)。

これは、ユーザーにデータ入力画面を表示するときにすべて問題ありません。私の質問は、POSTでもう一度チェックを実行する必要があるかどうかです。私に悪意のあるユーザーがいる場合、そのユーザーは、たとえばFiddlerをプロキシとして使用し、データをアプリケーションに渡す前にデータを変更することができます。したがって、上記のルールはPOSTで回避される可能性があります。上記のシナリオに対して良い戦略を持っている人はいますか?値を再度チェックする必要がありますか(同じチェックを実行するためにもう一度データベースに戻る)、またはたとえばIDをTempDataに保存し、POSTで再度アクセスして、そのIDをアクションに渡されたIDと比較する必要があります。 EntityBモデルに追加されましたか?これを行うためのより良い方法はありますか?

したがって、目標は、コードが繰り返されるのを防ぎ、安全なコードを作成することです。

編集:データベースに再度アクセスすることは避けたほうがよいでしょう。

4

1 に答える 1

2

もう一度存在することを確認する必要がありますEntityA(そして私が理解しているように、の存在しないことEntityB)。

コードの重複について:チェックは、統一されたメソッドに簡単にリファクタリングできます。

パフォーマンスに関して:まず第一に、セキュリティが最優先事項であり、それがデータベースへの余分なヒットを伴う場合は、そうなることを理解する必要があります。そうは言っても、そのヒットを回避するためのいくつかの良い解決策が確かにあります。たとえば、ID(最初の段階で正当であることがわかった)をCacheオブジェクトに保存します。

注:あなたの質問から、あなたのGUIDは「秘密」であると思います。つまり、他のユーザーには表示されません。そうでない場合は、渡されたIDが実際に認証されたユーザーに「属している」ことを検証するチェックを追加する必要があると思います。

于 2012-04-23T21:38:55.340 に答える