マルチ層アプリケーションの入力データを検証するためのベストプラクティス[クローズ

StackOverflow https://stackoverflow.com/questions/4848525

質問

アプリケーションには、さまざまなレイヤーがあります。サービスレイヤー、DAOレイヤー、アクション(アプリケーションを支柱)。

データは1つのレイヤーから別のレイヤーに渡されます。

入力検証を理想的にする必要がありますか?

ユーザーID、電話番号はUIから来ています、それらは必須です。そのため、すでにクライアント側で検証を行っています。

さて、私の意見によると、あなたが必要とするすべてのものです。他に検証されるべきではありません。

しかし、私の同僚の一人は、クライアントが直接リクエストを行うとどうなるかを主張しています。したがって、アクションも追加する必要があります。

現在、DAOでも同様に、同じ方法が他のアクションで使用されており、THTには検証がありません。

または、サービスレイヤーと言うと、Webサービスとしてたとえば露出する可能性があるため、u shdにも検証があります。

だから本質的に、彼は提案しています。私たちはどこでも検証を持っています。それは私にとって意味がありません。レイヤー間のその複製。

これに理想的なアプローチは何ですか?検証が単純なnullチェックまたは複雑な検証である可能性があるとします。

役に立ちましたか?

解決

Pangeaに同意すると、クライアントとサービスのエンドポイントに間違いなく検証が必要です。

検証の概念は「フェイルファスト」であることを付け加えます。各レイヤーに検証を追加して、ユーザーまたは発信者がトランザクションを潜在的に開始し、複雑なクエリを作成し、フィールドが短すぎることを見つけるためだけに書き込みを行うのではなく、コールが失敗する理由についてすぐにフィードバックを得るようにします。

クライアント側では、ユーザーの時間、帯域幅、サーバー側のリソースを無駄にしないように、できるだけ多くの検証を必要とします(多くの場合、組織があります)。ただし、通常、クライアント側のすべての検証を実行することはできません(たとえば、サインアップでそのようなユーザー名が既にあるかどうかを確認するため)。サービスレイヤーを押します。

サーバーレイヤーでは、すべての入力が潜在的に危険で間違っていると仮定する必要があります(そして、それらはしばしばそうなるでしょう)。実際に、サービスレイヤーの入力を検証する際により包括的かつ積極的になる方が良いと思います。それがあなたの最後の防衛線であるからです。クライアント側で検証を1つまたは2つ除外した場合、ユーザーに何が間違っているかを知らせるための優れた障害処理メカニズムが必要です。サービス側で何かを見逃して災害が発生した場合、それはデータベースのバックアップをデバッグして復元しようとする時間または日数を意味する可能性があります。

データベースレベルで行われるいくつかのチェックもあり、参照的な完全性などのようなものを実施しています。私は通常、さまざまなRDBMSのエラーメッセージを解釈し、ユーザーに理解できるLingoに戻そうとするため、書き込みを試みる前に、できるだけ確認してみてください。

他のヒント

アプリケーションが複数のエントリポイント(UIまたはシステムへのシステムインターフェイスまたはバッチシステム)を提供する場合は、 清める (nullチェック、フォーマットチェック、必要性など)これらのすべてのエッジのデータは、サービスレイヤーに到達する前に。 しかし、これは、検証ロジックを複製する必要があるという意味ではありません。 検証を一元化できるフレームワークを使用できます。これには、検証フレームワークの例があります 役職.

ただし、ドメインレイヤーに属するビジネス検証があり、ドメインサービスレイヤーまたはドメインオブジェクトに留まる必要があります。

私はあなたがDAOで検証を実行する必要があることに同意しません。 DAOは、CRUDの操作を担当するだけです。彼らがもっとやっているなら、あなたは漏れやすい層を持っています。バッチで物を処理する必要がある場合は、バッチがサービスレイヤーを通過していることを確認して、バッチが同じ検証を通過するようにする必要があります。

私が会話に追加できる知恵の一つは、クライアントを決して信用しないことです。クライアントがHTML、Flash/Flexなどに参加している場合でも、誰かがそれをハッキングし、あなたが望まないことをしようとする可能性があります。ここでのフォローアップは、誰かがそれをハッキングしようとする可能性がある場合、ソフトウェアエンジニアとして私たちはそれがハッキングされると想定しなければならないので、フロントエンドのチェックは素晴らしく、アプリケーションの使いやすさを支援することができます、たとえそれがチェックの複製につながる場合でも、バックエンドのすべての入力を検証する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top