web-dev-qa-db-ja.com

クエリ文字列の最大長はいくつですか?

ブラウザに依存しますか?また、Webスタックが異なると、リクエストから取得できるデータ量に制限がありますか。

486
Brian Sullivan

RFC 2616 (ハイパーテキスト転送プロトコル - HTTP/1.1)は問い合わせ文字列の長さに制限がないと述べています(セクション3.2.1)。 RFC 3986 も制限がないことを述べていますが、ホスト名はDNSの制限のために255文字に制限されていることを示しています(セクション2.3.3)。

仕様では最大長は指定されていませんが、Webブラウザとサーバーソフトウェアによって実用上の制限があります。 Boutell.com :にある調査に基づいて

  • Microsoft Internet Explorer(ブラウザ)
    Microsoftは、Internet ExplorerのURLの最大長は2,083文字で、URLのパス部分の長さは2,048文字以下であると述べています。これより長いURLを使用しようとすると、Internet Explorerで明確なエラーメッセージが表示されました。

  • Microsoft Edge(ブラウザ)
    制限は約81578文字です。 Microsoft EdgeのURLの長さの制限 を参照してください。

  • Chrome
    URLの64k文字以降は表示を停止しますが、100k文字を超える可能性があります。それ以上のテストはこれ以上行われませんでした。

  • Firefox(ブラウザ)
    65,536文字を超えると、ロケーションバーにWindows Firefox 1.5.xのURLが表示されなくなります。ただし、もっと長いURLでもかまいません。 10万文字以降はこれ以上テストは行われませんでした。

  • Safari(ブラウザ)
    少なくとも80,000文字が機能します。それ以上テストは試みられませんでした。

  • Opera(ブラウザ)
    少なくとも190,000文字が機能します。 190,000文字後にテストを中止しました。 Opera 9 for Windowsは、ロケーションバーに完全に編集、コピー、貼り付けが可能なURLを190,000文字で表示し続けました。

  • Apache(サーバ)
    Webブラウザの最大URL長を測定しようとする初期の試みでは、サーバーのURLの長さの制限は約4,000文字に達し、その後Apacheは "413 Entity Too Large"エラーを生成しました。 Red Hat Enterprise Linux 4にある最新のApacheビルドが使用されました。 Apacheの公式ドキュメントでは、リクエスト内の個々のフィールドに対する8,192バイトの制限についてのみ言及しています。

  • Microsoftインターネットインフォメーションサービス(サーバー)
    デフォルトの制限は16,384文字です(はい、MicrosoftのWebサーバーはMicrosoftのWebブラウザより長いURLを受け入れます)。これは設定可能です。

  • Perl HTTP :: Daemon(サーバー)
    最大8000バイトまで動作します。 PerlのHTTP :: Daemonモジュールを使ってWebアプリケーションサーバーを構築している人は、すべてのHTTPリクエストヘッダの合計サイズに16,384バイトの制限があります。これにはPOSTメソッドのフォームデータ、ファイルのアップロードなどは含まれませんが、URLは含まれます。実際には、URLが8,000文字を大幅に超えたときに413エラーが発生しました。この制限は簡単に取り除けます。 Daemon.pmで16x1024の出現箇所をすべて探し、それらをより大きな値に置き換えます。もちろん、これはDoS攻撃に対するあなたの危険度を高めます。

904
Robert Cartaino

公式には制限はありませんが、多くのセキュリティ構成の推奨事項では、サーバー上のmaxQueryStringsを最大文字数1024に設定し、クエリ文字列を含むURL全体を最大2048文字に設定する必要があります。これは、Webサーバー上のSlow HTTP Requestの脆弱性を防ぎ、Qualys Web Application Scannerや他のセキュリティスキャナーに現れる遅いDDOS攻撃を防ぐためです。

以下のWindows IIS Web.configを含むサーバーのコードを参照してください。

<security>
    <requestFiltering>
        <requestLimits maxQueryString="1024" maxUrl="2048">
           <headerLimits>
              <add header="Content-type" sizeLimit="100" />
           </headerLimits>
        </requestLimits>
     </requestFiltering>
</security>
2
matwonk

Webスタックが異なると、異なる長さのhttp要求がサポートされます。経験上、Safariの初期のスタックは4000文字しかサポートしていなかったため、USER-STATEのためにASP.netページを処理するのが困難だったことを私は知っています。これはPOSTの場合でも同じなので、ブラウザをチェックしてスタックの上限を確認する必要があります。新しいブラウザでも限界に達するかもしれないと思います。思い出せませんが、そのうちの1つ(IE6、私は思う)は16ビット制限、32,768か何かの制限を持っていました。

1
kdevine