1. ホーム
  2. c#

[解決済み] ダブルエスケープを有効にすることは危険か?

2022-06-03 04:28:36

質問

ASP.NET MVCアプリケーションで、/search/<searchterm>で検索できるルートを持っています。

私が "search/abc" を供給するとき、それはうまく動作しますが、私が "/search/a+b+c" (正しく url エンコードされた) を供給すると、IIS7 は HTTP Error 404.11 で要求を拒否します ( リクエストフィルタリングモジュールは、二重のエスケープシーケンスを含むリクエストを拒否するように構成されています。 ). まず第一に、なぜこのようなことが起こるのでしょうか?それが URL の一部である場合にのみエラーをスローするようですが、クエリ文字列の一部としてはスローしません (/transmit?q=a+b+c は問題なく動作します)。

Web.config のセキュリティ セクションでダブル エスケープ リクエストを有効にすることはできますが、その意味するところを理解していないため、そうすることをためらっていますし、サーバーが URL の一部として "a+b+c" というリクエストを拒否してクエリ文字列の一部として受け入れる理由も理解していません。

どなたか、どうすればよいか説明し、アドバイスをいただけないでしょうか。

どのように解決するのですか?

編集してください。 該当箇所の強調を追加しました。

基本的には IIS は過度に偏執的になっています。 URI デコードされたデータで特に不用意なことをしていなければ、このチェックを安全に無効にすることができます (たとえば、文字列連結によってローカル ファイルシステムの URI を生成するような場合)。

このチェックを無効にするには、次のようにします (以下は ここで ): (ダブルエスケープが何を意味するかについては、以下の私のコメントを参照してください)。

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

プラス記号が検索入力で有効な文字である場合、次のようになります。 が必要です。 を有効にし、IIS が URI のパスからそのような入力を処理することを許可する必要があります。

最後に、限定的ではありますが、非常に簡単な回避策は、単に '+' を避け、代わりに '%20' を使用することです。

いずれにせよ、スペースをエンコードするために '+' シンボルを使用することは ではなく 有効な url エンコーディングです。 が、限られたプロトコルのセットに固有のもので、後方互換性の理由からおそらく広くサポートされています。 正規化の目的だけであれば、スペースを '%20' としてエンコードするほうがよいでしょう。