ASP.NET MVC 3 の実稼働サイトで、「潜在的に危険な Request.Path 値がクライアント (%) から検出されました」というメッセージが時折表示されることに気付きました。Windows アプリケーション ログの未処理の例外。
これらは通常のサイトの使用 (つまり、ランダムな Web ボット) では完全に有効ですが、多くのリクエストは有効なローカル ISP ユーザーからのもののようです。
例外のリクエストの詳細では、リクエスト URL はリクエスト パスとは異なります。
リクエスト URL: http://www.somesite.com/Images/Image With Space.jpg
リクエストパス: /Images/Imagehttp://www.somesite.com/Images/Image With Space.jpgWithhttp://www.somesite.com/Images/Image With Space.jpgSpace.jpg
「リクエスト パス」で、パスに「スペース」がある場所はすべて、リクエスト URL の正確なコピーに置き換えられることに注意してください。
サイト内では、実際のリンクは次のようになります。
<img src="/Images/Image%20With%20Space.jpg" />
何がこれを引き起こしているのでしょうか?Request.Path と Request.Url のドキュメントを見ようとしましたが、なぜ異なるのかわかりません。リクエスト URL を直接ヒットすると、リソースが正しく表示されます。
更新: IIS 7.0 の失敗した要求トレース機能を使用して、誤動作している要求の 1 つのトレースを取得することができました。
リファラー: Google 検索
ユーザーエージェント: Mozilla/5.0 (iPad; Mac OS X のような CPU OS 5_1_1) AppleWebKit/534.46 (Gecko のような KHTML) バージョン/5.1 Mobile/9B206 Safari/7534.48.3
RequestURL: http://www.somesite.com:80/Images/Image%20With%20Space.jpg
URL を手動で iOS 5.1.1 に入力すると、画像が正しく表示されます。Google 画像で画像を検索すると、画像が正しく表示されます。いまだ繁殖に成功していません。
私が見るトレースの途中:
MODULE_SET_RESPONSE_ERROR_STATUS 警告。ModuleName="RequestFilteringModule"、Notification="BEGIN_REQUEST"、HttpStatus="404"、HttpReason="Not Found"、HttpSubStatus="11"、
IIS のドキュメントによると、Request Filtering モジュールの 404.11 は、URL の「二重エンコード」エラーです。http://www.somesite.com/Images/Image%2520With%2520Space.jpgのような二重エンコードされた URL を意図的に作成すると、少し実験して、イベント ログに正確なエラーが表示され、不正な形式のリクエスト パスが表示されます。
イベント ログ エラーの不正な要求パスは、ASP.NET 4.0 のバグのようです。
ただし、そもそもエラーが発生する理由は説明されていません。多数の失敗したリクエスト ログを確認しました。唯一の共通点は、すべて AppleWebKit を使用していることです。Safariのバグでしょうか?