検索
ホームページバックエンド開発C#.Net チュートリアルASP.NET MVCのバックグラウンドパラメータ検証のいくつかの方法

前書き

フロントエンドであってもバックエンドであっても、システム データの正確性を保証するためにユーザー入力を検証する必要があるのは一般的な問題です。 Web の場合、当然のことながらフロントエンドで検証したいと思う人もいるかもしれませんが、これは非常に間違ったアプローチです。フロントエンドのコードはユーザーに対して透過的であり、少しのテクノロジーを持っている人はこれを回避できます。確認してデータを直接バックステージに送信します。フロントエンド Web ページによって送信されるインターフェイスであっても、外部に提供されるインターフェイスであっても、パラメーターの検証はあらゆる場所で見られ、必須です。つまり、ユーザー入力はすべて信頼できません。

パラメータを検証する方法はたくさんありますが、一般的な検証方法をいくつか挙げるために mvc を例に挙げます。

[HttpPost]
public ActionResult Register(RegisterInfo info)

1. if-if

if(string.IsNullOrEmpty(info.UserName))
 
{
 
  return FailJson("用户名不能为空");
 
}
 
if(string.IsNullOrEmpty(info.Password))
 
{
 
  return FailJson("用户密码不能为空")
 
}

を使用して判断します。

パラメータを 1 つずつ検証します。この方法は最も粗雑ですが、当時 WebForm で実際に使用されていました。パラメータが少ないメソッドの場合は問題ありませんが、さらに多くのパラメータがある場合、さらに n 個の if-if を記述する必要があり、さらに重要なのは、この部分の判定を別のメソッドで再利用することはできません。

2. DataAnnotation を通じて

mvc は、アクション モデルを検証するための DataAnnotation を提供します。最終的に、DataAnnotation は RangeAttribute や RequiredAttribute などの一連の特性です。 ValidationAttribute の仮想メソッド IsValid は、マークされたオブジェクトが現在のルールに準拠しているかどうかを判断するために使用されます。 asp.net mvc はモデル バインディングを実行するときに、リフレクションを通じてマークされた ValidationAttribute を取得し、IsValid を呼び出して現在のパラメーターがルールに準拠しているかどうかを判断します。これが、検証が失敗した場合にエラー情報も収集される理由です。 ModelState.IsValid を使用してモデル検証が成功したかどうかを判断し、ModelState を使用して検証失敗の理由を取得します。例えば上記の例:

public class RegisterInfo
 
{
 
  [Required(ErrorMessage="用户名不能为空")]
 
  public string UserName{get;set;}
 
 [Required(ErrorMessage="密码不能为空")]
 
  public string Password { get; set; }
 
}

実はこの処理もmvcの実装原理を参考にすればwebform上でも実装可能です。このメソッドの利点は、実装が非常にエレガントで柔軟であることです。Model パラメーターを共有する複数のアクションがある場合、重要なのは、コードが非常に簡潔に見えることです。

ただし、この方法には欠点もあります。通常、プロジェクトには数十のインターフェイスなど、多くのインターフェイスがあり、インターフェイスごとにクラス パッケージング パラメーターを定義するのは少し贅沢です。実際、このクラスに名前を付けるのも非常に面倒です。

3. DataAnnotation はパラメータにもマークできます

検証機能の AttributeUsage を見ると、属性やフィールドだけでなくパラメータにもマークできることがわかります。つまり、次のように書くこともできます:

public ActionResult Register([Required(ErrorMessage="用户名不能为空")]string userName, [Required(ErrorMessage="密码不能为空")]string password)

このように書くこともOKですが、明らかに、このようにメソッドパラメータを記述すると、特に複数のパラメータがある場合、メソッドパラメータが見苦しくなります。複数の検証ルールがある場合。

4. ValidateAttribute をカスタマイズする

フィルターを使用して、mvc のアクションの実行前に認証や認可の処理などの処理を実行できることがわかりました。同様に、パラメータの検証にも使用できます。 FilterAttribute は、アクションの実行前と後にいくつかの操作を実行できるようにする一般的なフィルターです。ここで行う必要があるのは、アクションの前にパラメーターを検証することです。検証が失敗した場合、アクションは実行されなくなります。

次のように BaseValidateAttribute 基本クラスを定義します。

public class BaseValidateAttribute : FilterAttribute
 
{
 
  protected virtual void HandleError(ActionExecutingContext context)
 
  {
 
    for (int i = ValidateHandlerProviders.Handlers.Count; i > 0; i--)
 
    {
 
      ValidateHandlerProviders.Handlers[i - 1].Handle(context);
 
      if (context.Result != null)
 
      {
 
        break;
 
      }
 
    }
 
  }
 
}

HandleError は、検証が失敗した場合の結果を処理するために使用されます。ここで、ValidateHandlerProviders は、外部に登録できる結果を処理するための IValidateHandler について言及しています。 IValidateHandler は次のように定義されます。

public interface IValidateHandler
 
{
 
  void Handle(ActionExecutingContext context);
 
}

ValidateHandlerProviders は次のように定義され、デフォルトのプロセッサーがあります。

public class ValidateHandlerProviders
 
{
 
  public static List<IValidateHandler> Handlers { get; private set; }
 
  
 
  static ValidateHandlerProviders()
 
  {
 
    Handlers = new List<IValidateHandler>()
 
    {
 
      new DefaultValidateHandler()
 
    };
 
  }
 
  
 
  public static void Register(IValidateHandler handler)
 
  {
 
    Handlers.Add(handler);
 
  }
 
}  

この目的は、多くの特定の ValidateAttributes がある可能性があるため、このモジュールを分離し、最終処理を外部の決定に任せることができます。たとえば、プロジェクト Device:

public class StanderValidateHandler : IValidateHandler
 
{
 
  public void Handle(ActionExecutingContext filterContext)
 
  {
 
    filterContext.Result = new StanderJsonResult()
 
    {
 
      Result = FastStatnderResult.Fail("参数验证失败", 555)
 
    };
 
  }
 
}
で処理を定義できます。

次に、アプリケーションの起動時に登録します: ValidateHandlerProviders.Handlers.Add(new StanderValidateHandler());

ValidateRegexAttribute:

public class ValidateNullAttribute : BaseValidateAttribute, IActionFilter
 
{
 
  public bool ValidateEmpty { get; set; }
 
  
 
  public string Parameter { get; set; }
 
  
 
  public ValidateNullAttribute(string parameter, bool validateEmpty = false)
 
  {
 
    ValidateEmpty = validateEmpty;
 
    Parameter = parameter;
 
  }
 
  
 
  public void OnActionExecuting(ActionExecutingContext filterContext)
 
  {
 
    string[] validates = Parameter.Split(&#39;,&#39;);
 
    foreach (var p in validates)
 
    {
 
      string value = filterContext.HttpContext.Request[p];
 
      if(ValidateEmpty)
 
      {
 
        if (string.IsNullOrEmpty(value))
 
        {
 
          base.HandleError(filterContext);
 
        }
 
      }
 
      else
 
      {
 
        if (value == null)
 
        {
 
          base.HandleError(filterContext);
 
        }
 
      }
 
    }
 
  }
 
  
 
  public void OnActionExecuted(ActionExecutedContext filterContext)
 
  {
 
  
 
  }
 
}

同じ方法でさらに多くの検証を実装できます。

このようにして、上記の記述方法は次のようになります:

public class ValidateRegexAttribute : BaseValidateAttribute, IActionFilter
 
{
 
  private Regex _regex;
 
  
 
  public string Pattern { get; set; }
 
  
 
  public string Parameter { get; set; }
 
  
 
  public ValidateRegexAttribute(string parameter, string pattern)
 
  {
 
    _regex = new Regex(pattern);
 
    Parameter = parameter;
 
  }
 
  
 
  public void OnActionExecuting(ActionExecutingContext filterContext)
 
  {
 
    string[] validates = Parameter.Split(&#39;,&#39;);
 
    foreach (var p in validates)
 
    {
 
      string value = filterContext.HttpContext.Request[p];
 
      if (!_regex.IsMatch(value))
 
      {
 
        base.HandleError(filterContext);
 
      }
 
    }
 
  }
 
  public void OnActionExecuted(ActionExecutedContext filterContext)
 
  {
 
  }
 
}

全体的には問題ないようで、上記の DataAnnotation を評価して使用できます。ここで、エラーの説明など、より有用な情報を拡張できます。など待ってください。

まとめ

もちろん、各方法には欠点があります。この選択は特定の状況によって異なります。一般に、パラメータが多すぎる場合は、それらをオブジェクトでラップすることをお勧めします。

ASP.NET MVC バックグラウンド パラメーター検証のいくつかの方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
C#と.NET:2つの関係を理解し​​ますC#と.NET:2つの関係を理解し​​ますApr 17, 2025 am 12:07 AM

C#と.NETの関係は切り離せませんが、同じものではありません。 C#はプログラミング言語であり、.NETは開発プ​​ラットフォームです。 C#は、コードの書き込み、.NETの中間言語(IL)にコンパイルされ、.NET Runtime(CLR)によって実行されるために使用されます。

c#.netの継続的な関連性:現在の使用法を見るc#.netの継続的な関連性:現在の使用法を見るApr 16, 2025 am 12:07 AM

C#.NETは、複数のアプリケーション開発をサポートする強力なツールとライブラリを提供するため、依然として重要です。 1)C#は.NETフレームワークを組み合わせて、開発を効率的かつ便利にします。 2)C#のタイプの安全性とゴミ収集メカニズムは、その利点を高めます。 3).NETは、クロスプラットフォームの実行環境とリッチAPIを提供し、開発の柔軟性を向上させます。

Webからデスクトップまで:C#.NETの汎用性Webからデスクトップまで:C#.NETの汎用性Apr 15, 2025 am 12:07 AM

c#.netisversatileforbothwebanddesktopdevelopment.1)forweb、useasp.netfordynamicapplications.2)fordesktop、equindowsorwpfforrichinterfaces.3)usexamarinforcross-platformdeveliment、enabling deshacrosswindows、

c#.net and the Future:新しいテクノロジーへの適応c#.net and the Future:新しいテクノロジーへの適応Apr 14, 2025 am 12:06 AM

C#と.NETは、継続的な更新と最適化を通じて、新しいテクノロジーのニーズに適応します。 1)C#9.0および.NET5は、レコードタイプとパフォーマンスの最適化を導入します。 2).Netcoreは、クラウドネイティブおよびコンテナ化されたサポートを強化します。 3)ASP.Netcoreは、最新のWebテクノロジーと統合されています。 4)ML.NETは、機械学習と人工知能をサポートしています。 5)非同期プログラミングとベストプラクティスはパフォーマンスを改善します。

c#.netはあなたにぴったりですか?その適用性の評価c#.netはあなたにぴったりですか?その適用性の評価Apr 13, 2025 am 12:03 AM

c#.netissuitableforenterprise-levelApplicationsとsystemduetoitsSystemdutyping、richlibraries、androbustperformance.

.NET内のC#コード:プログラミングプロセスの調査.NET内のC#コード:プログラミングプロセスの調査Apr 12, 2025 am 12:02 AM

.NETでのC#のプログラミングプロセスには、次の手順が含まれます。1)C#コードの作成、2)中間言語(IL)にコンパイルし、3).NETランタイム(CLR)によって実行される。 .NETのC#の利点は、デスクトップアプリケーションからWebサービスまでのさまざまな開発シナリオに適した、最新の構文、強力なタイプシステム、および.NETフレームワークとの緊密な統合です。

C#.NET:コアの概念とプログラミングの基礎を探るC#.NET:コアの概念とプログラミングの基礎を探るApr 10, 2025 am 09:32 AM

C#は、Microsoftによって開発された最新のオブジェクト指向プログラミング言語であり、.NETフレームワークの一部として開発されています。 1.C#は、カプセル化、継承、多型を含むオブジェクト指向プログラミング(OOP)をサポートしています。 2。C#の非同期プログラミングは非同期を通じて実装され、適用応答性を向上させるためにキーワードを待ちます。 3. LINQを使用してデータ収集を簡潔に処理します。 4.一般的なエラーには、null参照の例外と、範囲外の例外インデックスが含まれます。デバッグスキルには、デバッガーと例外処理の使用が含まれます。 5.パフォーマンスの最適化には、StringBuilderの使用と、不必要な梱包とボクシングの回避が含まれます。

テストC#.NETアプリケーション:ユニット、統合、およびエンドツーエンドテストテストC#.NETアプリケーション:ユニット、統合、およびエンドツーエンドテストApr 09, 2025 am 12:04 AM

C#.NETアプリケーションのテスト戦略には、ユニットテスト、統合テスト、エンドツーエンドテストが含まれます。 1.単位テストにより、コードの最小ユニットがMSTEST、ヌニット、またはXUNITフレームワークを使用して独立して動作することを保証します。 2。統合テストでは、一般的に使用されるシミュレートされたデータと外部サービスを組み合わせた複数のユニットの機能を検証します。 3.エンドツーエンドのテストでは、ユーザーの完全な操作プロセスをシミュレートし、通常、セレンは自動テストに使用されます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、