http标头值的最大值?


326

HTTP标头是否存在可接受的最大允许大小?如果是这样,那是什么?如果不是,这是特定于服务器的还是允许任何大小的标头的公认标准?

Answers:


316

不,HTTP没有定义任何限制。但是,大多数Web服务器确实会限制它们接受的标头的大小。例如,在Apache中,默认限制为8KB,在IIS中,默认限制16K413 Entity Too Large如果标头大小超过该限制,服务器将返回错误。

相关问题:用户代理字符串可以达到多大?


10
此答案指出服务器接受的最大标头大小。但是Web服务器(例如Apache)能够发送的最大标头大小是多少?
Pacerier 2012年

@Pacerier:看起来像Apache的8175字节,但我仍在搜索。如果从任何后端进入这样的限制,也不要期望得到有用的错误消息。
2013年

2
@hakre:IIRC,整行为8K,计算整个标头行(标头的名称,空白和标头的有效载荷)。
vartec

有没有一种方法可以定义标题的自定义最大大小?
Sudip Bolakhe '19

由于SPNego和Kerberos协议的要求,IIS可能对16k开放,它们通常用于“ Windows身份验证”。
罗南·克杜杜

220

就像vartec上面说的那样,HTTP规范没有定义限制,但是默认情况下许多服务器都做过限制。实际上,这意味着下限是8K。对于大多数服务器,此限制适用于请求行和所有标头字段总和(因此,请使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。


6
对于apache2,URL的长度由每个HTTP标头行单独控制LimitRequestLineLimitRequestFieldSize适用于每个HTTP标头行...不是“ ...之和”
Yves Martin

1
Cookies的单独大小限制为4093字节。 stackoverflow.com/questions/640938/...
杰夫·洛厄里

25
无需编写代码即可获取页面大小。从终端:getconf PAGESIZE
Ponytech'Mar 3''15

6
自编写此答案以来,这种情况可能已经改变,但是链接的nginx页面与答案不匹配。nginx页面指示默认缓冲区大小为8k,并且请求默认可以使用4个缓冲区(缓冲区大小本身限制了请求行和每个单独的标头的大小)。因此,这表明nginx允许在16-32k之间的某个位置(我假设一行不能跨两个缓冲区分割,因此缓冲区可能不会一直填满)。
Lily Ballard

加入在Apache 2.4,它的数值是相同的:httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize:阿帕奇2.0,2.2,2.4:8K
地中海阿里Difallah

5

HTTP并未对每个标头字段的长度或整个标头部分的长度设置预定义的限制,如2.5节所述。在实践中,通常会根据特定的字段语义找到对各个标头字段长度的各种特殊限制。

HTTP标头值受服务器实现的限制。Http规范不限制标头大小。

接收到大于其希望处理的请求标头字段或一组字段的服务器,必须以适当的4xx(客户端错误)状态码进行响应。忽略此类标头字段会增加服务器请求走私攻击的漏洞(第9.5节)。

413 Entity Too Large发生这种情况时,大多数服务器将返回或出现相应的4xx错误。

如果字段语义使得在不改变消息帧或响应语义的情况下可以安全地忽略丢弃的值,则客户端可以丢弃或截断大于客户端希望处理的报头字段。

HTTP标头的大小不受限制,使服务器容易受到攻击,并可能降低其服务有机流量的能力。

资源


2

这是最受欢迎的Web服务器的限制

  • 阿帕奇-8K
  • Nginx-4K-8K
  • IIS-8K-16K
  • Tomcat-8K – 48K

1

我还发现,在某些情况下,出现许多标头的情况下使用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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.