だるろぐ

明日できることは、今日しない。

危険な可能性のある Request.Form 値がクライアントから検出されました

f:id:daruyanagi:20120219013646p:plain

ASP.NET 規定の動作では、入力にHTMLタグが含まれていると、バリデーションでエラーを吐く(HttpRequestValidationException)。これはこれでありがたいのだけど、どうしてもHTMLタグを受け入れたい場合はある。

ページ単位でバリデーションを無効にする

web.config に設定を記述する。

<configuration>
    <system.web>
        <httpRuntime requestValidationMode="2.0" />
        <pages validateRequest="false">
        </pages>
    </system.web>
</configuration>

メソッド単位でバリデーションを無効にする。

POSTメソッドをまるごと。

[HttpPost]
[ValidateInput(false)]
public ViewResult Edit(FormCollection form)
{

}

ASP.NET MVC 3 ValidateRequest(false) not working with FormCollection - Stack Overflow

フォームデータ単位でバリデーションを無効にする。

Request クラスの拡張メソッド Unvalidated() を利用する。自分ではこれしか使わない。

コントローラーで使ってみる。

using System.Web.Helpers;

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

ビューでも使えるんだね。

@Request.Unvalidated("html")

<form method="post">
    <input type="text" name="html" />
    <input type="submit" />
</form>

System.Web.Helpers を活用する - まめしば雑記

補足

DB に HTML タグを突っ込みたい場合は AllowHtml 属性を付与してやる。

[AllowHtml]
[DisplayName("本文")]
public string Body { get; set; }

HTML タグを含む文字列を生のまま出力したい場合は、@Html.Raw() が利用できる。

@Html.Raw(hoge)

HTML タグを含む文字列を変数として保持したい場合は、 HtmlString/MvcHtmlString クラスを使う。MvcHtmlString は ASP.Net 3.5 MVC 2 から使えるが、 HtmlString は MVC 3 のみ。これからは HtmlString 使えばいいんじゃないかな。中身がどう違うのかはよく知らない。

var hoge = new MvcHtmlString("<b>hoge</b>");

HTML タグを安全に出力したい場合は HttpUtility.HtmlEncode() を使う。

@HttpUtility.HtmlEncode(hoge)

※ 間違ってるところがあったら、ぜひ教えてほしいです......