/ search/<searchterm>を介した検索を可能にするルートを備えたASP.NET MVCアプリケーションがあります。
「search/abc」を指定すると正常に機能しますが、「/ search/a + b + c」(正確にURLエンコード)を指定すると、IIS7はHTTPエラー404.11でリクエストを拒否します(リクエストフィルタリングモジュールはダブルエスケープシーケンスを含む要求を拒否するように構成されています)。まず第一に、なぜこれを行うのですか? URLの一部である場合にのみエラーがスローされるようですが、クエリ文字列の一部としてではありません(/ transmit?q = a + b + cは正常に機能します)。
これで、web.configのセキュリティセクションでダブルエスケープリクエストを有効にできましたが、その意味を理解していないため、サーバーがリクエスト「a + b + c」をURLの一部ですが、クエリ文字列の一部として受け入れます。
誰かが何をすべきかを説明してアドバイスを与えることができますか?
Edit:関連セクションに強調を追加。
基本的に:IISは過度に妄想的です。URIでデコードされたデータで特に賢明なことを行わない場合は、このチェックを安全に無効にできます(文字列連結によるローカルファイルシステムURIの生成など))。
チェックを無効にするには、以下を実行します( here から):(二重エスケープに伴うものについては、以下のコメントを参照してください)。
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
</system.webServer>
プラス記号が検索入力で有効な文字の場合、needを有効にして「allowDoubleEscaping」を有効にしてIIS
最後に、非常に単純な、限られた回避策は、単に「+」を避け、代わりに「%20」を使用することです。 いずれの場合でも、スペースをエンコードするために「+」記号を使用することは、notvalid url encoding、ただし、限られたプロトコルセットに固有であり、おそらく後方互換性の理由で広くサポートされています。正規化のみを目的とする場合は、とにかくスペースを '%20'としてエンコードすることをお勧めします。これは、IIS7の問題をうまく回避します(%25abなど、他のシーケンスで発生する可能性があります)。
「/ search/a/b/c」のような検索URLを持つことを考えましたか?
次のようなルートを設定する必要があります
search/{*path}
そして、アクションのパス文字列から検索値を抽出します。
HTH
チャールズ
addいくつかの情報を Eamon Nerbonneの回答 関連あなたの質問の「すること」の部分に(理由を説明しないで)。
特定のアプリケーションの設定も簡単に変更できます
以下を入力します(ここから取得: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-taining.aspx ):
%windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true
(たとえば、このルールをデフォルトのWebサイトに適用するために、YOURSITENAME
をDefault Web Site
に置き換えることができます)
例:
IIS 7.5でアプリケーションでServer.TransferRequest()を実行しています。
ファイル名をエンコードすると二重エスケープの問題が発生しますが、エンコードしないと "潜在的に危険なRequest.Path" エラーが発生します。
Server.TranferRequest()に渡すURLに空のプロトコルも含めて任意のプロトコルを追加すると、問題が修正されました。
動作しません:
context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");
作品:
context.Server.TransferRequest("://folder/bar%20bar.jpg");