1

ここで質問するのが適切かどうかはわかりませんが、MVC5 を使用して文字列内に HTML を投稿するときに 1 つの問題に苦労しています。問題は、コントローラーが要求にヒットし、応答が送信されるようになると、ASP.NET MVC フレームワークで次のような検証エラーをトリガーできるものは他にあるでしょうか? :

潜在的に危険な Request.Form 値がクライアントから検出されました (messagebody="

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

スタックトレース:

[HttpRequestValidationException (0x80004005): 潜在的に危険な Request.Form 値がクライアントから検出されました messagebody=" html tags here ")。System.Web.HttpRequest.ValidateString(文字列値、文字列 collectionKey、RequestValidationSource requestCollection) +12339710
System.Web.HttpValueCollection.Get(文字列名) +90
System.Web.Caching.OutputCacheModule.CreateOutputCachedItemKey(文字列パス、HttpVerb 動詞、HttpContext コンテキスト、CachedVary cachedVary) +956 System.Web.Caching.OutputCacheModule.OnLeave(オブジェクト ソース、EventArgs eventArgs) +1212
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +92 System.Web.HttpApplication.ExecuteStep (IExecutionStep step, Boolean& completedSynchronously) +165

ASP.NET MVC の組み込み要求検証を認識しており、ビュー モデルのプロパティに[AllowHtml]次のような属性で注釈を付けました。

public class MyClassVM 
{
  [AllowHtml]
   public string MessageBody { get; set; }
}

..そのため、コントローラーアクションに到達してオブジェクトに逆シリアル化するのに問題はありません。次に、コントローラーのアクションで、次のようにフレームワークが投稿されたメッセージのコンテンツを MyClassVM インスタンスに逆シリアル化するようにします。

[HttpPost]
 public ActionResult Details(NotificationVM notificationVm)
 {
     if (ModelState.IsValid)
     {
         string messageBody = notificationVm.MessageBody; 
         //do things like saving something in DB. This works good!
     }
     var serverError = Server.GetLastError(); //null. No errors at this point
     return new HttpStatusCodeResult(HttpStatusCode.OK);
}

ただし、private void Application_Error(object sender, EventArgs e)メソッドに到達し、Server.GetLastError(); その段階で、リクエスト内の html コードによる検証例外が含まれています。

なんで?コントローラがほぼその仕事を終えた後、何がその検証エラーを引き起こす可能性がありますか? 応答の途中にあるフィルター内の何かでしょうか? (いくつかのフィルターがありますが、それらはかなり基本的な認証フィルターのように見えます.Jsonシリアライザーを変更して日付があれば置き換えます..)。

また、デバッグ時に最後に確認できるコードは、System.Security.Principal.IIdentity にアクセスするいくつかのプロパティですが、それがどのように問題になるかわかりません..

更新:コントローラーのアクションの上部に [ValidateInput(false)] を追加しようとしましたが、違いはありません。潜在的に危険な Request.Form 値も検出され、例外がトリガーされます。

更新:コントローラーがヒットする前に実行されていたカスタムモデルバインダーも無効にしようとしました。しかし、うまくいきません。問題は、コントローラーのアクションが実行され、既に逆シリアル化されたポスト ビュー モデルからフィールドが適切に読み取られた後に発生する別の何かである必要があります。

ありがとうございました

4

1 に答える 1

0

MVC フレームワークの一部としての ModelState 検証に関係していました。この記事のおかげで、私はそれについて学び、私の問題を解決しましたModelState.Clear()

于 2015-08-27T04:56:59.270 に答える