12

ユーザー入力の検証は Web フォーム アプリケーションのどこに配置しますか?

  1. 表示: JavaScript クライアント側
  2. コントローラー: サーバー側言語 (C#...)
  3. モデル: データベース (ストアド プロシージャまたは依存関係)

各レベルで必要な検証があると思います:

  1. ユーザーが正しい値を入力したか
    • 日付は実際の日付、数字は実際の数字です...
  2. 1. のすべてのチェックに加えて、悪意のある攻撃 (IE XSS または SQL インジェクション) のチェックをもう一度実行します。
    • 1. で行われるチェックは、主に、ユーザーがミスをしたときにサーバーのラウンド トリップを回避するためのものです。
    • それらはクライアント側で JavaScript で実行されるため、それらが実行されたことを信頼することはできません。これらの値を再度検証すると、一部の悪意のある攻撃が阻止されます。
  3. 依存関係が満たされているか (つまり、ユーザーが有効な質問にコメントを追加したか)
    • 優れたインターフェースは、これらの違反を非常に困難にします。ここで何かがキャッチされた場合、何かが非常にうまくいかなかった.

[この回答に触発された]

4

10 に答える 10

8

私はすべての階層をチェックインしましたが、私が使用する検証トリックに注意したいと思います。

データベース層で検証します。モデルの適切な制約により、データの整合性が自動的に検証されます。

これは、ほとんどの Web プログラマーが見失っているように見える技術です。

于 2008-09-25T16:37:05.407 に答える
5

モデルでの検証。オプションで、モデルからヒントを取得してユーザーエクスペリエンスを向上させるUIの自動化されたルーチン。

自動化されたルーチンとは、ユーザーインターフェイスにモデルごとの検証コードがあってはならないことを意味します。RoR(validates_presence_of:usernameなどのメソッドがある)などの検証メソッドのライブラリがある場合、コントローラーまたはビューはこれらを読み取り、同等のjavascript(または便利なもの)メソッドを適用できる必要があります。

つまり、UIで完全な検証ライブラリを複製するか、既存のライブラリを使用する場合は少なくともマッピングを提供する必要があります。ただし、これが完了すると、モデルの外部に検証ロジックを作成する必要がなくなります。

于 2008-09-25T16:44:34.407 に答える
4

検証はすべてのレイヤーで実行できます。

Webフォームからの入力(すべての文字列、適切な型へのキャストなど)の検証は、WebサービスやXMLファイルなどからの入力の検証とは異なります。それぞれに独自の特殊なケースがあります。もちろん、Validatorヘルパークラスを作成して、Validationを外部化し、ビューで共有できるようにすることもできます。

次に、DAOレイヤーの検証が行われます。モデルに永続化するのに十分なデータがありますか(null以外の制約を満たすためなど)。データベースにチェック制約を設定することもできます(ステータスは('N'、'A'、'S'、'D')など)。

于 2008-09-25T16:41:13.227 に答える
3

これは面白い。長い間、私はモデルですべての検証を実行しました。これは、DAL(データアクセス層)と見なすもののすぐ上です。私のモデルは通常、抽象化と低レベルAPIを提供するDALを備えたテーブルデータゲートウェイの後にパターン化されます。

TDGの側面では、次のようなビジネスロジックと検証を実装します。

  1. ユーザー名は空ですか
  2. ユーザー名は30文字を超えています
  3. レコードが存在しない場合は、エラーを返します

アプリケーションが複雑になるにつれて、JavaScriptを使用してクライアント側で検証の多くを実行できることに気付き始めました。そこで、ほとんどの検証ロジックをJSにリファクタリングし、モデルをクリーンアップしました。

次に、サーバー側の検証(フィルタリング/エスケープではなく、私は異なると思います)は、サーバーでも実行する必要があり、クライアント側でのみ実行する必要があることに気付きました。

ですから、検証ロジックが戻ったとき、私が再び気付いたとき、おそらくINPUT検証/アサーションとビジネスルール/ロジックの間に明確な違いがあることに気づきました。

基本的に、アプリケーションのクライアント側で(JSを使用して)実行できる場合、これはINPUT検証であると見なします...モデルで実行する必要がある場合(このレコードはすでに存在するかなど)、次のように見なします。ビジネスの論理。紛らわしいのは、どちらもデータモデルの整合性を保護していることです。

ユーザー名の長さを検証しない場合、ユーザーが1文字のユーザー名を作成するのを防ぐにはどうすればよいですか?

私はまだそのロジックを次にどこに置くかを完全に決定していません、それはあなたがもっと好きなもの、薄いコントローラー、重いモデル、またはその逆に本当に依存すると思います...

私の場合、コントローラーはアプリケーション中心になる傾向がありますが、モデルを注意深く作成すれば、内部だけでなく「他の」プロジェクトでも再利用できることが多いので、モデルを軽量にし、コントローラーを重い側に保つことを好みます。

どちらの方向にもあなたを駆り立てるのは、本当に個人的な意見、要件、経験などです...

興味深い主題:)

于 2008-11-26T08:37:56.433 に答える
3

検証はコントローラーで行う必要があります。これは、安全性と応答を保証する唯一の場所です。

検証はビューで実行する必要があります。これは連絡先であり、最高のUEを提供し、サーバーの余分な作業を節約します。

検証モデルで行われますが、特定のコアレベルのチェックに対してのみ行われます。データベースは常に適切な制約を反映する必要がありますが、これを実際の検証に当てはめるのは非効率的です。また、データベースが単純な制約で有効な入力を決定することは常に不可能です。

于 2008-11-26T09:07:26.500 に答える
2

すべての検証は少なくとも1回は実行する必要があります。これは、値オブジェクト(DDDの意味で、DTOと混同しないでください)にあるか、エンティティ自体のビジネスオブジェクトを介しているかにかかわらず、中間層で行う必要があります。クライアント側の検証は、ユーザーエクスペリエンスを向上させるために発生する可能性があります。フォームで間違っていることをすべて一度に公開できるため、クライアント側の検証を行わない傾向がありますが、それは私の個人的な好みです。データベースの検証は、ロジックを台無しにした場合にデータの整合性を保証するために発生する可能性があります。中間層またはバックエンドの何か。

于 2008-09-25T16:45:45.697 に答える
0

私はビューとコントローラーでのみそれを行います。データベースはデータ型などによってその一部を強制しますが、エラーをキャッチせずにそれほど遠くまでは到達しないようにしたいと思います。

あなたはほとんど自分の質問に答えましたが、知っておくべき重要なことは、ビューを信頼することはできないということです。ただし、これがユーザーにフィードバックを提供する最も簡単なルートであるため、少なくとももう1つのレベルでサニタイズする必要があります。

于 2008-09-25T16:43:52.520 に答える
0

うーん、わかりません。この記事を読むまで、私はコントローラーと言っていたでしょう:細いコントローラー、太いモデル

http://blog.astrumfutura.com/archives/373-The-M-in-MVC-Why-Models-are-Misunderstood-and-Unappreiated.html

于 2009-08-09T21:19:35.730 に答える
0

ほとんどの検証はビジネス ルールに依存するため、サード パーティのツール クラスとしてビジネス レイヤーで検証を行います。ユーザー入力など、他のタイプの検証もありますが、コントローラーで行う必要がありますが、それらの検証ルールをサード パーティのクラスにカプセル化することもできます。本当に、それは何を検証するかによって異なります。

クライアント側の検証はマイナーなもので、軽量の入力検証を構築するために作成されましたが、サーバー側の検証は常に必要です。ユーザー入力を信頼することはできません;)

.NETには検証を構築する優れたコントロールがありますが、ビジネス レイヤーには常にデータを検証するためのより優れたアプローチが必要であり、それらのコントロールはそのタスクに十分ではありません。

于 2009-08-09T21:29:30.920 に答える
-1

ビューでの簡単な入力検証。モデルでの完全な検証。理由?ビュー テクノロジを変更し、検証がビュー/コントローラーにある場合は、新しいビューの検証を書き直す必要があります。これにより、バグが発生する可能性があります。モデルに入れると、これはすべてのビューで再利用されます...

しかし、私が言ったように、スピードと使いやすさのためにビューで単純な検証を行います。

于 2009-09-16T15:27:04.417 に答える