5

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のバグでしょうか?

4

2 に答える 2

1

制限されたユーザーエージェントを考えると、これはIOS5.1.1上のそのブラウザによるURLの誤った処理を表している可能性があると考えざるを得ません。私はそのようなデバイスを個人的に所有していないので、これをテストすることはできませんが、代わりに実際にスペースが含まれているURLでデバイスがどのように動作するかを調査することは興味深いでしょう。

%20ページソースからのURLを見て、それが役に立っていると思って二重にエンコードしているような気がします。IISが(ASP.netが起動する前に)それをデコードし%20、スペースではなくリテラルが表示されるようになったため、乳母車からガラガラと音を立ててしまうという問題があります。

個人的には、サーバーのセキュリティ設定を変更することはお勧めしません。しかし、それが最も簡単な解決策になるので、私はあえてそれがあなたがすることだと言います。

むしろ、この「バグ」を確認できれば(私はすでに道を進んでおり、Appleの弁護士から安全な隠れ場所を見つけています)、このデバイスで機能するフォーマットを見つけてください。または、リソースのURLからすべてのスペースを削除します。A-が最良の選択肢です。

于 2012-07-16T15:33:50.747 に答える
1

Web.Config の httpRuntime セクションを変更して、URL 検証を調整できます。ASP MVC プロジェクトは通常、検証モード 2.0 で実行されます。既定の無効な文字 (コンマで区切られている) は次のとおりです。

<httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\" />

ご覧のとおり、% 記号は無効と見なされます。スペースを %20 にエンコードすると、検証エラーが発生する可能性があります。requestPathInvalidCharactersWeb.Config ファイルのセクションに属性を追加httpRuntimeし、「%」の部分を除いて、以下にリストした値をコピーするだけです。

Scott Hanselman は、この問題に関するブログ投稿を持っています。

http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx

于 2012-07-12T13:57:39.107 に答える