2013-10-23 153 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'的值並讓用戶決定。 –