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

#1 楼

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

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

评论


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

–起搏器
2012年6月12日在8:24



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

– hakre
13年5月26日在9:49



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

–vartec
13年5月26日在11:50



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

– Sudip Bolakhe
19年4月30日在9:52

注意防火墙限制!我们开始有很多用户无法登录。显然,6月9日,fortiguard更新了其HTTP.Server.Authorization.Buffer.Overflow的IPS定义,以限制授权标头的长度-请​​参阅:fortiguard.com/encyclopedia / ips / 12351我们不得不猜测由于缺少文档,授权标头的长度可能是多少。最终可以接受大约350个字符。

– Dykstrad
20年6月26日在18:36

#2 楼

就像vartec上面说的那样,HTTP规范没有定义限制,但是默认情况下许多服务器都这样做。实际上,这意味着下限是8K。对于大多数服务器,此限制适用于请求行和所有标头字段的总和(因此,请确保您的Cookie简短)。


Apache 2.0,2.2:8K


nginx:4K-8K
IIS:因版本而异,8K-16K
Tomcat:因版本而异,8K-48K(?!)

值得注意的是,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。

评论


对于apache2,URL的长度由LimitRequestLine控制,并且LimitRequestFieldSize分别应用于每个HTTP标头行,而不是“ ...的和”。

–伊夫·马丁(Yves Martin)
13年5月31日13:00

Cookies的单独总大小限制为4093字节。 stackoverflow.com/questions/640938/…

–杰夫·洛里(Jeff Lowery)
2014年11月17日19:37



无需编写代码即可获取页面大小。从终端:getconf PAGESIZE

– Ponytech
15年3月11日在22:31

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

–莉莉·巴拉德(Lily Ballard)
16年4月5日,0:35

在apache 2.4上添加保持不变的值:httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize:Apache 2.0,2.2,2.4:8K

–阿里·迪法拉(Med Ali Difallah)
17-4-4在14:15



#3 楼


HTTP并未对每个标头的长度或整个标头部分的长度设置预定义的限制,如2.5节中所述。实际上,通常根据特定的
字段语义,对各个标头的字段长度进行各种临时限制。


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


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


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


如果字段语义是
使得丢弃值( s)可以安全地忽略而无需更改
消息框架或响应语义。


未封顶的HTTP标头大小使服务器容易受到攻击,并可能降低其提供有机服务的能力。交通。

来源

#4 楼

这是最流行的Web服务器的限制


Apache-8K
Nginx-4K-8K
IIS-8K-16K
Tomcat-8K – 48K


#5 楼

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

#6 楼

如果要使用Akamai之类的DDOS提供程序,则它们在响应标头大小中的最大限制为8k。因此,基本上尝试将响应标头的大小限制在8k以下。