web-dev-qa-db-ja.com

ダブルエスケープを有効にすると危険ですか?

/ 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の一部ですが、クエリ文字列の一部として受け入れます。

誰かが何をすべきかを説明してアドバイスを与えることができますか?

130
Alex

Edit:関連セクションに強調を追加。

基本的に:IISは過度に妄想的です。URIでデコードされたデータで特に賢明なことを行わない場合は、このチェックを安全に無効にできます(文字列連結によるローカルファイルシステムURIの生成など))。

チェックを無効にするには、以下を実行します( here から):(二重エスケープに伴うものについては、以下のコメントを参照してください)。

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

プラス記号が検索入力で有効な文字の場合、needを有効にして「allowDoubleEscaping」を有効にしてIIS

最後に、非常に単純な、限られた回避策は、単に「+」を避け、代わりに「%20」を使用することです。 いずれの場合でも、スペースをエンコードするために「+」記号を使用することは、notvalid url encoding、ただし、限られたプロトコルセットに固有であり、おそらく後方互換性の理由で広くサポートされています。正規化のみを目的とする場合は、とにかくスペースを '%20'としてエンコードすることをお勧めします。これは、IIS7の問題をうまく回避します(%25abなど、他のシーケンスで発生する可能性があります)。

152
Eamon Nerbonne

「/ search/a/b/c」のような検索URLを持つことを考えましたか?

次のようなルートを設定する必要があります

search/{*path}

そして、アクションのパス文字列から検索値を抽出します。

HTH
チャールズ

2
Charlino

addいくつかの情報を Eamon Nerbonneの回答 関連あなたの質問の「すること」の部分に(理由を説明しないで)。
特定のアプリケーションの設定も簡単に変更できます

  1. 管理者権限でコンソールを開く(スタート-cmd-右クリック、管理者として実行)
  2. 以下を入力します(ここから取得: 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サイトに適用するために、YOURSITENAMEDefault Web Siteに置き換えることができます)

  3. 準備完了.

例:

  1. まず、私は同じ問題を抱えていました: HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.
  2. 上記のテキストを入力: Drupal7-anotherSolution to HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.
  3. 期待通りに動作するようになりました: Solution to HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.
2
Sk8erPeter

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");
0
mhenry1384