web-dev-qa-db-ja.com

URLルーティング、画像ハンドラー、および「潜在的に危険なRequest.Path値」

私は今かなり長い間この問題を経験しており、いくつかの考えのためにここに質問を投稿することにより、一度限りなくその底に到達しようとすることを決めました。ここにある.net 4 Webサイトに画像ハンドラーがあります。

https://www.amadeupurl.co.uk/ImageHandler.ashx?i=3604 (プライバシーのために実際のドメインを削除)

これは問題なく動作し、問題なくWebサーバーから画像を提供します。URLにアクセスすると正常に動作し、画像がロードされ、例外が生成されないため、問題なく言うことができます。しかし、誰かが昨日この正確なURLにアクセスし、次の行に沿って例外が発生しました。

Exception Generated
Error Message:
A potentially dangerous Request.Path value was detected from the client (?).
Stack Trace:
at System.Web.HttpRequest.ValidateInputIfRequiredByConfig() at System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context)

Technical Information:
DATE/TIME: 23/01/2013 03:50:01
PAGE: www.amadeupurl.co.uk/ImageHandler.ashx?i=3604

私はエラーメッセージを理解していますが、それは問題ではありません、ここでそれが生成される理由を理解していません。事態を悪化させるために、イメージをロードするリンクをクリックすると言ったように、それを複製することはできません。例外はありません。 URLルーティングを使用しており、次のコードで問題が発生した場合に無視されるようにハンドラーを登録しています。

routes.Ignore("{resource}.ashx")

他にエラーが発生する理由や、他に何を試す必要があるのか​​はわかりません。

39
James

Asp.Net 4.0+には非常に厳密な組み込みのリクエスト検証が付属しています。その一部は、XSS攻撃で使用される可能性のあるURL内の潜在的な危険な文字です。 URLのデフォルトの無効な文字は次のとおりです。

_< > * % & : \ ?_

構成ファイルでこの動作を変更できます。

_<system.web>
    <httpRuntime requestPathInvalidCharacters="<,>,*,%,&,:,\,?" />
</system.web>
_

または、.Net 2.0検証に戻ります。

_<system.web>
    <httpRuntime requestValidationMode="2.0" />
</system.web>
_

非常に一般的な無効な文字は_%_であるため、万が一(攻撃、Webクローラー、または一部の非標準ブラウザー)URLがエスケープされている場合、次のようになります。

_www.amadeupurl.co.uk/ImageHandler.ashx/%3Fi%3D3604
_

これの代わりに:

_www.amadeupurl.co.uk/ImageHandler.ashx/?i=3604
_

_%3F_は_?_のエスケープ文字であることに注意してください。この文字は、Asp.Netリクエストバリデーターによって無効と見なされ、例外をスローします。

_A potentially dangerous Request.Path value was detected from the client (?).
_

エラーメッセージには、再び_?_である文字(%3F)のエスケープされていないバージョンが表示されます

ここに良い記事があります リクエストの検証とその対処方法

93
Kamyar Nazeri