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


559

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



GETリクエスト専用です!POSTリクエストの最大サイズ(multipart / form-dataの有無にかかわらず)はここでは不明です!
peterh-2015年

回答:


996

RFC 2616(ハイパーテキスト転送プロトコル— HTTP / 1.1)は、クエリ文字列の長さに制限がないと述べています(セクション3.2.1)。RFC 3986(Uniform Resource Identifier — URI)にも制限はないと記載されていますが、DNSの制限のためにホスト名が255文字に制限されていることが示されています(セクション2.3.3)。

仕様では最大長は指定されていませんが、実際の制限はWebブラウザーとサーバーソフトウェアによって課されます。残念ながら元のサイトでは利用できなくなった調査(これは怪しげなローンのサイトにつながります)に基づいていますが、それでもInternet Archive Of Boutell.comで見つけることができます。

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

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

  • Chrome 64万文字を超えるとURLの表示
    停止しますが、10万文字を超える場合があります。それ以上のテストは行われませんでした。

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

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

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

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

  • Microsoft Internet Information Server(サーバー)
    デフォルトの制限は16,384文字です(はい、MicrosoftのWebサーバーはMicrosoftのWebブラウザーよりも長いURLを受け入れます)。これは構成可能です。

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


8
「Microsoft Internet Explorer(ブラウザ)」の代わりにバージョン番号も教えてくれませんか?
LCJ、2014年

5
クエリ文字列のデフォルトのIIS制限は、16,384文字を大幅に下回っているようです
JTech


タイプを作成したと思います。DNSの制限については、2.2.3ではなく、RFC3986の「3.2.2。ホスト」で説明しています。「URIプロデューサーは、DNSの使用がすぐに明らかにならない場合でも、DNS構文に準拠した名前を使用し、これらの名前の長さを255文字以下に制限する必要があります。」
Craig Hicks

java.lang.IllegalArgumentException: Request header is too largeTomcatのスプリングブートアプリケーションサーバーに原因があります。
Paramvir Singh Karwal

12

公式にはRFC 2616で指定されている制限はありませんが、多くのセキュリティプロトコルと推奨事項では、サーバーのmaxQueryStringsは最大文字数の1024に設定する必要があると述べています。クエリ文字列を含むURL全体は最大2048文字。これは、WebサーバーでのスローHTTPリクエストDDOSの脆弱性を防ぐためです。これは通常、Qualys Web Application Scannerおよびその他のセキュリティスキャナーの脆弱性として現れます。

以下のWeb.configを使用したWindows IISサーバーのサンプルコードを参照してください。

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

これはmachine.configを使用してサーバーレベルでも機能します。

注:クエリ文字列とURLの長さを制限しても、スローHTTPリクエストのDDOS攻撃を完全に防ぐことはできませんが、これを防ぐための1つのステップです。


2
そして今、私はGETリクエストのqueryParamsで36文字のUUIDのリストを受け入れないことをバックエンドエンジニアに伝えることができる理由があります。ありがとう!
モルドレッド

1

異なるWebスタックは、異なる長さのHTTPリクエストをサポートします。Safariの初期のスタックは4000文字しかサポートしていないため、USER-STATEが原因でASP.netページの処理に問題があったことを経験から知っています。これはPOSTでも発生するため、ブラウザを確認してスタック制限を確認する必要があります。新しいブラウザでも限界に達するかもしれないと思います。覚えていませんが、そのうちの1つ(IE6だと思います)には16ビットの制限、32,768などの制限がありました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.