読者です 読者をやめる 読者になる 読者になる

なか日記

一度きりの人生、楽しく生きよう。

ASP.NET MVCでリクエストの検証を無効にする

ASP.NET

HTMLタグを含むデータを投げると、ASP.NETのリクエスト検証でエラーになります。

f:id:nakaji999:20150130044246p:plain

せっかくCKEditorでwysisygな編集ができるようになったのに、これじゃぁ意味がないですね。

というわけで、リクエストの検証を無効にします

無効にする方法

MSDNに情報が載っています。

ASP.NET MVCで検証を無効化する方法は、アクションメソッド、プロパティ、リクエスト内のフィールド単位の3種類あるようです。

1.アクションメソッド単位

メソッドに対して、アトリビュートValidateInput(false)を指定します。

[HttpPost]
[ValidateInput(false)]
public ActionResult Create(EventInfo eventInfo) 
{
   // ~ 略 ~
}

2.プロパティ単位

プロパティに対して、アトリビュートAllowHtmlを指定します。

[Display(Name = "内容")]
[AllowHtml]
[DataType(DataType.MultilineText)]
public string Contents { get; set; }

3.リクエスト内のフィールド単位

Request.Unvalidatedメソッドを使ってアクセスします。

var rawComment = Request.Unvalidated().Form["comment"];

注意点

ASP.NETの検証を無効化するので、scriptタグ等本当に問題ないのか自前でちゃんと確認する必要があります。

方法としては、一旦HTMLエンコードしといて、意図したものだけHTMLタグに戻すとか。

// 入力された文字列をHTMLエンコード
StringBuilder sb = new StringBuilder(
    HttpUtility.HtmlEncode(htmlInputTxt.Text));

// 意図したものだけHTMLタグに戻す
sb.Replace("&lt;b&gt;", "<p>");
sb.Replace("&lt;/b&gt;", "</p>");

その他にサードパーティのライブラリ(Html Agility Packとか?)を使用するという方法もあるし、Markdownで書いてHTMLに変換するという方式もあるよってなことがMSDNには書かれています。

Html Agility Packでどんなことができるのかはまた今度確認しておきたいですね。