web-dev-qa-db-ja.com

正しく処理するIISパーセント記号付きリクエスト(/%)

IIS https://stackoverflow.com/% and http://などのリクエストを適切に取得するためのあらゆる種類のソリューションを探していますbing.com/% 400 Bad Requestページを表示せず、 http://google.com/% および http:/ /facebook.com/% do(明らかにこれらの例はIISにはありません).

http://support.Microsoft.com/kb/820129 ごとに、該当するすべてのhttp.sysレジストリ設定(AllowRestrictedChars、PercentUAllowed)を設定しようとしたとは思いますが、それでも役に立ちませんでした。 AllowRestrictedCharsとカスタム400ページを設定すると、URLが https://stackoverflow.com/%12 のように修正されますが、/%は修正されません。

14
bkaid

これはIISカーネルレベルでブロックされています。テストとしてeveryモジュールをIISそのため、静的ページハンドラすらなく、400エラーメッセージが表示されていました。

IISでそれを回避することは不可能だと思います。あなたが言及したレジストリ設定は、他の種類の制限された文字に対するものです。その機能を変更するためのレバーを見たことがありません。

あなたの目標はそれを避けることですか?攻撃面が広くなり、不完全なURLエスケープシーケンスをブロックした結果、正当な訪問者が失われることは想像できません。

Update2:これに関する3つの素晴らしいリンクがあります。 IISチームのNazim LalaとWade Hilmoの両方が、あなたの質問に関する議論のため、これについてブログを書いています。また、Scott Hanselmanが.NET内のクエリ文字列の部分に素晴らしい投稿をしています:

更新:信頼できる回答を得るためにIISチームのメンバーに確認しました。%はRFC 1738( http://www.ietf.org/rfc/rfc1738.txt )に従って安全でない文字と見なされました。

関連するテキストは次のとおりです。

安全ではない:

文字はいくつかの理由で安全ではない可能性があります。スペース文字は安全ではありません。URLが転記またはタイプセットされるか、ワープロプログラムの処理を受けると、重要なスペースが消えたり、重要でないスペースが導入されたりする可能性があるためです。文字「<」と「>」は、フリーテキストのURLの区切り文字として使用されるため、安全ではありません。一部のシステムでは、引用符( "" ")を使用してURLを区切ります。WorldWide Webおよび他のシステムでは、フラグメント/アンカーからURLを区切るために使用されるため、文字"# "は安全ではなく、常にエンコードする必要があります。 文字「%」は他の文字のエンコードに使用されるため、安全ではありません。ゲートウェイやその他のトランスポートのため、他の文字は安全ではありませんエージェントはこのような文字を変更することが知られています。これらの文字は、「{」、「}」、「|」、「\」、「^」、「〜」、「[」、「]」、「 `」です。

安全でない文字はすべてURL内で常にエンコードする必要があります。たとえば、通常はフラグメントまたはアンカー識別子を処理しないシステムでも、文字「#」はURL内でエンコードする必要があります。そのため、URLを使用する別のシステムにURLをコピーする場合、URLを変更する必要はありません。 URLエンコーディング。

したがって、IISは、コアレベルでこれをプロアクティブにブロックします。これは、攻撃対象領域を最小限に抑えるプロアクティブなセキュリティ対策です。

20

これを回避する唯一の方法は、IISカーネルができる前にURLをチェックするようなものです。

エンドユーザーをそのURLに転送する前に、動的に生成されたリンクをスクリプトで送信してチェックする必要があります...

それを除けば、これがIISが希望どおりに処理しない唯一の状況です。したがって、除去のプロセスにより、未処理の要求がある場合、それが原因を知っています。

おそらく、カスタム400ページでリファラーをチェックすると、トラフィックのソースを絞り込むのに役立ちますか?

3
Garrett

私は3つの可能な方法を考えることができます

  1. IISを変更して、通常よりも400エラーのカスタムページを指すようにします。

  2. これがIISの特定のWebサイトに固有のものである場合は、web.configで次のようにすることができます。

    <customErrors defaultRedirect = "ErrorPage.aspx" mode = "On">
    <error statusCode = "400" redirect = "myCustom400Error.aspx" />
    </ customErrors>

  3. 着信URLを検査して処理するhttpModuleを作成する

3
Dave Wise

IISフォーラムのこの post は、HTTP 400(Bad Request)がhttp.sysによってブロックされ、IISこれは、@ Scott Forsyth-MVPが元の回答に含めたリンクと一致します。

これらのリクエストのログは、c:\ Windows\System32\LogFiles\HTTPERR \にあります。

このようなエラーに対してユーザーに返される応答ページを構成できるかどうかはわかりませんが、Bingでもこの問題が発生しているので、それが不可能であるか、恐ろしいシステムハックが必要になるのではないかと思います。

2
Hector Correa