web-dev-qa-db-ja.com

httpヘッダの最大値は?

HTTPヘッダーの許容最大サイズはありますか?もしそうなら、それは何ですか?そうでない場合、これはサーバー固有のものか、または任意のサイズのヘッダーを許可するために認められている標準ですか?

285
Cory

いいえ、HTTPでは制限はありません。ただし、ほとんどのWebサーバーは受け入れるヘッダーのサイズを制限しています。たとえば、 Apacheのデフォルト制限 は8KB、 IISは16K です。ヘッダサイズがその制限を超えると、サーバは413 Entity Too Largeエラーを返します。

関連質問: ユーザエージェント文字列はどれくらいの大きさになりますか?

281
vartec

Vartecが前述したように、HTTP仕様は制限を定義していませんが、多くのサーバはデフォルトで定義しています。これは、実質的に言えば、下限が8Kであることを意味します。ほとんどのサーバーでは、この制限はリクエスト行とALLヘッダーフィールドの合計(つまり、Cookieを短くする)に適用されます。

Nginxがデフォルトでシステムページサイズを使用することは注目に値します。これはほとんどのシステムで4Kです。この小さなプログラムで確認できます。

pagesize.c:

#include <unistd.h>
#include <stdio.h>

int main() {
    int pageSize = getpagesize();
    printf("Page size on your system = %i bytes\n", pageSize);
    return 0;
}

gcc -o pagesize pagesize.cでコンパイルしてから./pagesizeを実行してください。 Linode からの私のubuntuサーバーは、答えが4kであることを忠実に私に知らせます。

204

セクション2.5で説明されているように、HTTPは各ヘッダフィールドの長さやヘッダセクション全体の長さに事前定義の制限を設けていません。個々のヘッダーフィールドの長さに対するさまざまなアドホックな制限が実際に見いだされます、しばしば特定のフィールド意味論に依存して。

HTTPヘッダー値はサーバー実装によって制限されています。 HTTP仕様は、ヘッダサイズを制限しません。

それが処理したいより大きい要求ヘッダーフィールドまたはフィールドのセットを受け取るサーバーは適切な4xx(Client Error)ステータスコードで応答しなければなりません。そのようなヘッダーフィールドを無視することは密輸攻撃を要求するためのサーバーの脆弱性を増大させるでしょう(セクション9.5)。

この場合、ほとんどのサーバーは413 Entity Too Largeまたは適切な4xxエラーを返します。

クライアントは、フィールドのセマンティクスがメッセージのフレーミングや応答のセマンティクスを変更せずに安全に無視できるようなものである場合、クライアントが処理しようとしているサイズより大きい受信ヘッダーフィールドを破棄または切り捨てることがあります。

HTTPヘッダーのサイズが制限されていないと、サーバーは攻撃にさらされ続け、有機トラフィックを処理する能力が低下する可能性があります。

出典

4
realPK

私はまた、いくつかのケースでは、多くのヘッダがある場合の502/400の理由が、サイズに関係なく多数のヘッダがあることが原因である可能性があることを発見しました。ドキュメントから

tune.http.maxhdrリクエストの最大ヘッダー数を設定します。リクエストにこの値よりも大きいヘッダがいくつか含まれている場合(最初の行を含む)、「400 Bad Request」ステータスコードで拒否されます。同様に、大きすぎる応答は「502 Bad Gateway」でブロックされます。広く使用されているApacheサーバーが同じ制限を使用することを考えると、デフォルト値は101です。バグの多いアプリケーションが修正されるまでに一時的に機能するようにするには、この制限をさらにプッシュすると便利です。新しいヘッダはセッションごとに32ビットのメモリを消費するので、この制限を大きくしすぎないでください。

https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr

0
Shay Rybak