危険な可能性のある Request.Form 値がクライアントから検出されました
執筆日時:
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>
補足
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)
※ 間違ってるところがあったら、ぜひ教えてほしいです......