2010-07-24 103 views
14

我正在構建一個同時使用HTTP內容和HTTP標頭來發送和接收數據的AJAX應用程序。瀏覽器不能讀取從HTTP Header收到的數據,因爲它太大?如果是,那麼所有瀏覽器的限制是多少?HTTP頭對於瀏覽器來說可能太大了嗎?

我知道,理論上沒有限制HTTP報頭的大小,但在實踐的是,過去的是,我可以在特定的平臺,瀏覽器或安裝在客戶端計算機上的某些軟件的問題點或機器。我更關注使用HTTP標頭的安全操作指南。換句話說,HTTP頭可以用來傳輸額外的數據,而不會有潛在的問題進入線路,到什麼程度?


謝謝,對於這個問題的所有輸入,它非常讚賞和有趣。托馬斯回答得到了賞金,但Jon Hanna's answer提出了關於代理的一個很好的觀點。

+1

什麼樣的數據是你transmittin通過標題?如果您使用的是AJAX,爲什麼不使用JSON或XML而不是將東西放在標題中? – iblamefish 2010-07-24 18:01:17

+0

在問題中已經說過,我已經在使用數據結果的內容了。在頭部傳遞的數據是額外的數據。對於發送的數據,它是JSON編碼的數據。 – HoLyVieR 2010-07-24 18:02:21

+0

http://stackoverflow.com/questions/1097651/is-there-a-practical-http-header-length-limit – ankitjaininfo 2010-07-24 18:06:20

回答

6

實際上,雖然有些規則禁止代理不通過某些標頭(事實上,可以修改的規則非常清晰,甚至可以通知代理它是否可以修改由以後的標準添加的新標頭),這隻適用於「透明」代理,並不是所有代理都是透明的。特別是一些他們不理解爲有意安全操作的抹頭。

此外,實際上有些做法不當(儘管事情比他們要好得多)。

因此,除了顯而易見的核心標題外,可以依賴於從服務器傳遞到客戶端的標題信息量爲零。

這只是你不應該依賴頭部使用的原因之一(例如,爲客戶端準備重複請求應該緩存的內容,或者爲服務器發送整個實體時你需要一個範圍),除非明顯的情況下驗證頭(在失敗到安全的原則下)。

2

HTTP/1.1的RFC顯然不會限制標頭或主體的長度。

按照這個頁面現代瀏覽器(Firefox,Safari,Opera)除IE外可以處理長URI:http://www.boutell.com/newfaq/misc/urllength.html。我知道它與接收標題不同,但至少表明它們可以創建併發送巨大的HTTP請求(可能無限長)。

如果有一個在瀏覽器中的任何限制它會是這樣的可用內存或變量類型的限制的大小等

+1

對於每個人投票,請注意,這只是說明協議是什麼,這在理論上是瀏覽器應該處理的,但是每個人都知道理論往往與實踐不一樣。這不是我正在尋找的答案。這僅僅是對答案的感覺。 我想要的不僅僅是「我感覺它會是這樣的」。 – HoLyVieR 2010-08-04 00:35:47

+1

我同意HoLyVieR,這不是一個真正的答案。這只是一些相關的信息。真的,這首先不是一個很好的問題,它要求的統計數據並不是真正公開的,因爲通常人們並不在乎。然而,對於那些確實照顧足夠多的人來說,編寫一個測試瀏覽器限制並在各種瀏覽器中運行的AJAX應用程序有多難?結果比詢問其他沒有進行這種測試的人更可靠。 – 2010-08-05 18:23:29

0

從理論上講,沒有限定,可以在發送的數據量瀏覽器。這幾乎就像說網頁正文中的內容數量有限制。

如果可能,請嘗試通過文檔正文傳輸數據。爲了安全起見,考慮分割數據,以便加載多次。

4

兩件事。

首先,爲什麼不直接運行一個測試,讓瀏覽器逐漸增大和更大的標題,並等到它遇到一個不起作用的數字?只需在每個瀏覽器中運行一次。這是解決這個問題的最可靠方法。即使它不完全全面,你至少也有一些實際的數字可以消除,而這些數字可能會覆蓋絕大多數用戶。

第二,我同意所有人說這是一個壞主意。如果你真的擔心達到極限,不應該很難找到不同的解決方案。即使你在每一個瀏覽器上測試,仍然有防火牆等擔心,而且你絕對沒有辦法測試每一種組合(我幾乎肯定沒有其他人在你之前做過這些) 。每個案例你都無法得到硬性的限制。

雖然理論上,這應該都很好,以後可能會有一個邊緣情況下,如果你決定這樣做,咬你的屁股。

TL; DR:這是一個壞主意。節省您的麻煩,找到一個真正的解決方案,而不是一個解決方法。


編輯:既然你提到的請求可能來自多種來源的,爲什麼不直接指定在請求頭中的源和擁有的數據在體內完全包含?在標頭中有一些SourceClientType字段,用於指定請求來自何處。如果它來自瀏覽器,請將HTML包含在主體中;如果它來自PHP應用程序,請在其中放入一些PHP特定的東西;等等。如果該字段爲空,則根本不要添加任何額外的數據。

+1

+1來源或客戶類型。你可以使用GET參數來指定應該給出什麼類型的響應。 – 2010-08-08 04:30:52

38

簡短回答:

相同的行爲:在流行的瀏覽器沒有找到

最低限制:每頭

  • 10KB
  • 256 KB在一個響應的所有頭。從的MacBook運行Mac OS X 10.6.4

測試結果:

最大響應成功加載,所有數據在一個標頭:

  • 歌劇10:150MB
  • 的Safari 5:20MB
  • IE 6 via Wine:10MB
  • Chrome 5:250KB
  • F irefox 3.6:10KB

注意 在Opera,Safari和IE那些無恥的大標題需要幾分鐘來加載。

Chrome的注意事項: 整個HTTP標頭的實際限制似乎爲256KB。 出現錯誤消息:「錯誤325(net :: ERR_RESPONSE_HEADERS_TOO_BIG):未知錯誤。「

注到Firefox: 當發送通過多個頭數據100MB工作得很好,只是分手了超過10000頭

我的結論: 如果你想支持每頭所有流行的瀏覽器10KB似乎是爲所有頭一起極限,256KB

我的PHP代碼用來產生這些答覆:

<?php 

ini_set('memory_limit', '1024M'); 
set_time_limit(90); 
$header = ""; 

$bytes = 256000; 

for($i=0;$i<$bytes;$i++) { 
    $header .= "1"; 
} 

header("MyData: ".$header); 
/* Firfox multiple headers 
for($i=1;$i<1000;$i++) { 
    header("MyData".$i.": ".$header); 
}*/ 

echo "Length of header: ".($bytes/1024).' kilobytes'; 

?> 
+0

https://cs.chromium.org/chromium/src/net/http/http_stream_parser.h?q=ERR_RESPONSE_HEADERS_TOO_BIG&sq=package:chromium&dr=C&l=159看起來Chrome瀏覽器從未被放大。 – jcolebrand 2016-09-25 21:06:55

相關問題