42

私はかなり長い間この問題を経験してきましたが、考えてみるためにここに質問を投稿することで、その問題の根底にたどり着こうと決心しました。ここにある.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")

他にエラーが発生する理由や、他に何を試すべきかわかりません。

4

3 に答える 3

97

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) が表示されますが、これも?また

これは、リクエストの検証とその対処方法に関する優れた記事です。

于 2013-01-23T21:13:13.243 に答える