パラメータの検証、ストアドプロシージャとC#のデータアクセスレイヤー

私は、データソースとしてC#とSQLサーバーデータベースを使用して3つの層アーキテクチャを使用しています。 DRYプリンシパルによれば、検証は、私の場合、フロントエンドのデータアクセス層またはデータベースのストアドプロシージャのいずれかである1つの場所で行う必要があります。

だから私は、データアクセス層でストアドプロシージャのパラメータを検証するか、ストアドプロシージャ自体に残すかどうか疑問に思っていましたか?

2

2 答え

DRY is an important principle, but so is defence in depth.

入力を検証する場合は、安全であることを確認する必要があります。これは、各レベル(DALとストアドプロシージャの両方)で行う必要があります。

ビジネスロジックのデータを検証する場合、これはビジネスロジックレイヤー(BLL)に配置する必要があります。

6
追加された
あなたは深く乾燥したものを選ぶことを提案していますか?この二つには大きな違いがあるからです。
追加された 著者 jim,
@ジム - それは判断の問題です。あなたはもっと重要なことを決める必要があります。
追加された 著者 Oded,

3層アーキテクチャを使用している場合は、代わりにNhibernateやLinq to EntitesなどのORMを使用することを検討することをお勧めします。 ORMは、より良いリファクタリング能力と保守性を提供します(私の保守性は、私の経験に基づいて、長期的には品質につながるので、最も重要なことです)。

あなたのDAL(データアクセスレイヤー)であなたのセキュリティを迂回させる(偶然にまたは意図的に)UIよりも安全なので、あなたの検証をUIに入れるのは賢明ではありません。 SQLインジェクションについて考える。 UI上で見逃しやすいようなUIのみではなく、アクセスが許可されていない他のデータにアクセスしようとする悪意のあるユーザーとして簡単に迂回することができます。

私はユーザビリティのためにUI上に、そして安全のためにデータアクセス層にバリデーションを潜在的に持つことが理にかなっていると思います。私はDRYプリンシパルが1つの場所で妥当性検査をしているのが好きですし、あなたはまだそれを行うことができます。データアクセスレイヤーとUIの両方に適用される共通のルールセットを作成すると、(データ入力の即時のフィードバックを通じて)安全で使いやすいシステムが得られます。他の方法では、異なるレイヤーに対して異なるルールを持つことができます。例えば、フィールド長ルールおよびデータ入力パターンは、UI特有のものとすることができる。 DALは、例えば、データが有効であることを強制することができる。複数の場所でバリデーションを行っていますが、別々に同じことをしていない限り、あなたは大丈夫だと思います。これは、バリデーションがクロスカッティングの問題であり、アプリケーション設計の残りの部分をどのように構成するかに大きく依存するため、アプリケーションを設計する際に考慮すべき最も難しい領域の1つです。

1
追加された
ORMとストアドプロシージャを使用しています。それが私がパラメータについて尋ねた理由です。 UIまたはBLLでそれらを一度有効にしています。だからなぜSPの中に?
追加された 著者 jim,
深い防御。どのレイヤーもバイパスすることができると仮定する必要があります。私は防衛がタマネギ、階層化された、そして多くのレベルのようなものでなければならないという類推があると思います。
追加された 著者 Dessus,