水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > .NET Framework4 / ASP.NET4を導入

.NET Framework4 / ASP.NET4を導入

2010年8月9日(月曜日)

.NET Framework4 / ASP.NET4を導入

公開: 2010年8月11日0時45分頃

URLに%22が含まれると例外が出る問題」を受けて「URLに%22が含まれても何とかする方法」を実装したのですが、これはこれで以下のような問題があります。

というわけでさらにスマートな解決方法を探していたのですが、意外にあっさり見つかりました。

ASP.NET 4 also enables you to configure the characters that are used by the URL character check. When ASP.NET finds an invalid character in the path portion of a URL, it rejects the request and issues an HTTP 400 error. In previous versions of ASP.NET, the URL character checks were limited to a fixed set of characters. In ASP.NET 4, you can customize the set of valid characters using the new requestPathInvalidChars attribute of the httpRuntime configuration element, as shown in the following example:

<httpRuntime requestPathInvalidChars="&lt;,&gt;,*,%,&amp;,:,\,?" />

以上、ASP.NET 4 and Visual Studio 2010 Web Development Overview - Expanding the Range of Allowable URLs より

以前のASP.NETでは、URLに含まれる「不正な文字」をチェックするルールは固定でしたが、ASP.NET4からはカスタマイズできるようになったと。ASP.NET4ではルーティングの設定が可能になったということもあって、このようなカスタマイズができるようにしたのでしょう。

そんなわけで、早速.NET Framework 4 をインストール。IISの設定を変えてASP.NET4を有効にして、web.configに <httpRuntime requestPathInvalidChars=""> を追加してみました。

するとこれがエラーで動かないわけですよ。httpRuntime要素の説明 (msdn.microsoft.com)を見てもそれらしい属性が載っていませんし。本当に使えるのかと疑問に思いつつもさらに調べると、「RequestPathInvalidCharacters プロパティ (msdn.microsoft.com)」というドキュメントがみつかりました。

なんだあるじゃないか……と思いきや、よく見るとrequestPathInvalidCharsではなくrequestPathInvalidCharactersとなっているではありませんか。試しに属性名をrequestPathInvalidCharactersにしてみたところ、あっさり動作しました。さっきのサンプルが間違っていたということになりますね。

まあともあれ動いたのでめでたし、と思ったら、今度は掲示板にタグを含むコメントを投稿することができなくなっていることが判明。「危険な可能性のある Request.Form 値がクライアントから検出されました。」と言われてしまうので、validateRequest=true相当の動作になっているものと思われます。

※validateRequestについては「ASP.NET に XSS?」参照。

ASP.NET4ではこのあたりの動作も変更されているようで、結論としてはrequestValidationMode (msdn.microsoft.com)に2.0などを指定してやれば良いようです。

結局、以下のような記述になりました。

<configuration>
<system.web>
<httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" />
</system.web>
</configuration>

ひとまずこれで意図通りの動作になっているようです。

しかし言うまでもありませんが、XSSへの考慮が不十分なシステムでは、この設定は危険なので注意が必要です。逆に言うと、ASP.NET4では、デフォルトである程度のXSSは防いでくれるということでもありますが。

関連する話題: C# / .NET / ASP.NET / IIS / プログラミング / hatomaru.dll

最近の日記

関わった本など