きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

ASP.NET Web Pagesの入力フォームでタグ等の入力を受け入れる

ASP.NETの入力フォームに対する既定のバリデーション

ASP.NETでは以前から*1、既定の動作として入力フォームに対してフレームワーク側でバリデーションを行い、例えばタグとして解釈できるもの("<"と">"で囲まれた文字)等がある場合、HttpRequestValidationException 発生させるようになっています。

例えば、emailという名前のinput要素に『hoge 』と入力した場合、

危険な可能性のある Request.Form 値がクライアント (email="hoge <hoge@example.com>") から検出されました。

のように、HttpRequestValidationException が発生します。


『余計なお世話』と感じる方もいるかもしれませんが、『既定の動作をより安全な方に傾ける』という実装ですので、これはフレームワークの既定の動作としては正しい実装だと思います。

Web Pages(Razor)で検証させずに受け取る方法

ただしこのままだと、当然ですがタグ入力を受け入れたい場合等には仕様を満たせません。『フレームワーク側でバリデーションされないようしたい』という事は往々にして発生するでしょう。

例えば、上記のメールアドレスの入力*2を受け取ろうと思した場合、通常は以下のように受け取ると思いますが、このままですと上記の通りの例外が発生します

var email = Request.Form["email"];

では、Web Pages(Rasor)では、どうやって受け取れば良いか。

Web PagesではRequestオブジェクトにUnvalidatedという拡張メソッドがあり、これを使うことで、受け取る一つ一つのフォーム値に対して、『これは安全でなくても受け取る』という指定をしながら受け取ることができいます。

例えば以下のようなコードになります。

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

詳細については以下のMSDNドキュメントを参照ください:
http://msdn.microsoft.com/en-us/library/gg568738(v=vs.99).aspx

*1:多分、ASP.NET2.0から

*2:『hoge 』はRFC2822的にはValidなメールアドレス表現です。もちろん、これを受け入れるかどうかはアプリケーションの仕様次第ですが:p