2013-10-23 195 views
3

我看了一下,发现GET请求URL超过Jetty中最大长度的问题的答案是将jetty.xml中的headerBufferSize设置为更大的数字,如this Solr troubleshooting manualthis在Jetty中设置最大URL长度

但是,我很难理解头缓冲区大小与请求URL的长度有什么关系?如果设置headerBufferSize增加请求的URL长度限制,那么headerBufferSize的6 KB值与请求的URL的最大长度是一致的?我之所以问,是因为大多数浏览器强加的URL的最大长度大约为2000个字符,如What is the maximum length of a URL in different browsers?,而headerBufferSize的单位是字节。

回答

8

在一个典型的POST请求,你会看到下面的...

POST /to/my/path HTTP/1.1 
Content-Type: application/x-www-form-urlencoded;charset=utf-8 
Host: https://my.machine.com 
Content-Length: 10 

Action=Add 

打破下来:

  • 通过Content-Length的线的POST是请求头。
    • POST线是已知的,在HTTP术语,作为Request-Line,其包含的方法(POST)+绝对路径(/到/我/路径)+ HTTP版本(HTTP/1.1)
    • Content-Type - 让我们知道正文内容是如何格式化/编码的。
    • Host - 让服务器知道正在访问哪些主机(主要用于虚拟主机设置)
    • Content-Length - 让我们知道有正文内容为10字节
  • Action=Add是POST正文内容。

它的核心有2个部分的请求或响应,标题和正文内容。

当您设置headerBufferSize时,您正在设置标题内容(非主体内容)的最终上限。

当您拥有无限制的标头大小(从滥用内存消耗到导致CPU使用过多的故意HashMap冲突)时,会出现大量的滥用/漏洞。限制标题缓冲区大小限制了这些问题的范围。 (这些漏洞并非Jetty独有,但对所有Web服务器都存在)

如果您遇到了这些限制,您应该考虑评估您如何使用solr(例如在应该使用POST时错误地使用GET),因为增加headerBufferSize也会让你知道各种已知的网络漏洞。

更新:2013年10月24日

见相关What is the maximum length of a URL

+0

我不是想增加'headerBufferSize'但更多的好奇,想知道什么是GET请求的最大长度其他答案URL。根据你的回答,我假设要知道URL的最大允许大小的唯一方法是通过获取最大头部缓冲区大小(由Jetty允许)并减去头部大小(不包含请求URL)来计算。这是对的吗? –

+0

添加更新以回答指向其他更详细的关于URL长度的答案。 (这个问题是浏览器的具体问题,但答案不是) –

+1

感谢您的信息。为了清楚起见,我在工作中被问到找出Jetty可以接受的请求URL的最大长度。由于我的Jetty服务器接受由浏览器生成的编程请求,因此我必须记录GET方法的最大长度,用户可以安全地使用该方法将请求发送到我的服务器。如果我发出一个很大的数字,它们可能会遇到问题,如果它们添加到请求的请求URL +标头的大小超过了允许的“headerBufferSize”。现在,想一想,我可能只是给出'headerBufferSize'的值并让用户决定。 –