論HTTP請求大小

http://www.cnblogs.com/yjf512/archive/2013/03/29/2988296.html

HTTP分爲URI,HEADER,Body三個部分。每個部分都可以包含請求信息,那麼每個部分是否都有請求大小限制呢?剛開始以爲這個問題很容易找到答案,後來發現這也是個挺複雜的問題。

URI

首先是URI,我們知道,在GET請求中,請求參數是放在URL進行傳遞的,所以,HTTP GET的請求最關心的一個問題:能有多長?我能放多少參數?URI

從HTTP 1.1協議中開始找:(RFC 2616)

The HTTP protocol does not place any a priori limit on the length of a URI

所以明確一點的是HTTP協議是沒有顯式限制URI的長度的。理論上來說你在URI中傳遞多少參數都是可以的。

 

但是現實往往無法永遠照進陽光:

1 瀏覽器限制

所有主流瀏覽器都會對URI的長度進行限制。如果你在瀏覽器中輸入過長的URI,那麼瀏覽器會自動進行截斷。各個瀏覽器對URI長度的限制各不相同,甚至不同版本也不一樣。大約一個概念,2000字符以內的URI都能符合所有主流瀏覽器的要求。

2 服務端限制

即使客戶端同意發送無限長度的URI,但是服務器一方一般都是有長度限制的。一般服務是沒有專門針對URI的參數限制的,但是由於URI是會包含在request header中的,所以對header的大小限制是會對URI起作用的,比如nginx的(large_client_header_buffers)這個屬性,它默認是4k。

 

題外話

這裏的“URI是包含在request header中的” 這句話其實是有問題的。URI在HTTP協議中是叫做request-Line的,如果具體看協議,是會發現request-Line和request-header是兩個不一樣的,就是說request的請求其實該分爲request-line, request-header, request-body三個部分的(具體可以看http://www.ietf.org/rfc/rfc2616.txt 第4和5章)。但是好像使用的時候都默認將header中理解爲包含了request-line(比如這篇文章http://trafficserver.apache.org/docs/v2/sdk/HTTPHeaders.html)。這裏估計是概念和使用的時候導致問題,不必深究了,所以我們不妨將request-line理解爲包含在header中就好。

 

不管如何,綜上所述,這裏的URI不論是客戶端還是服務端,基本是被默認限制住的。

Header

header中存放的信息非常多,比如request-line,cookie,還有各種key-value的特定header字段和值。有點時候,我們也會往header中添加一些自定義的屬性。header的長度和URI的情況是一樣的。協議中並沒有顯示限制header的大小。理論上在header中放多少屬性都是可以的。

但是實際上:

1 瀏覽器限制

各個主流瀏覽器限制幾十k~幾百M不等的限制。基本上能滿足平時的需求了。但是如果這個長度對你業務有很大影響的話,建議還是親自測試下。

2 服務端限制

比如nginx的large_client_header_buffers就限制了header的長度。你也可以自己設置。

 

可能會影響header的參數還有:

client_header_buffer_size

client_header_timeout

各參數可以參考:http://wiki.nginx.org/HttpCoreModule

Body

body和URI,header非常不一樣,不一樣的地方原因在於文件上傳。HTTP是支持request中帶文件的,那麼文件的二進制數據不會放在URI或者header裏面,它是放在body裏面的。那麼這個body的大小就一定不能默認限制太小,尤其是客戶端。

 

首先理論上,協議是沒有對body大小做任何限制的。

其次,瀏覽器也沒有對body做任何大小限制,因爲如果瀏覽器做了大小限制就意味着它直接影響了你的服務功能。

所以對body的限制的任務就放在了服務器上了。這裏就我最熟悉的nginx+php-fpm來看下有哪些地方可以對body進行限制:

1 nginx有一些設置會對body大小產生影響

client_max_body_size,這個參數可以限制body的大小,默認是1m

client_body_timeout,當body太大,或者網絡太差的時候,這個也有可能會影響請求的成功率的。

2 php.ini也有一些設置會對上傳的body數據產生影響

upload_max_filesize,限制最大上傳文件大小

post_max_size ,限制post的大小

memory_limit,限制內存使用大小

max_execution_time,這個是php最大執行時間,也有可能影響請求成功率的。

HTTP請求大小有什麼影響

首先是安全因素考慮。

試想一下一個網站的服務器是不限制body大小的,那麼它就是可以被黑客利用攻擊的地方了。黑客利用這一點往HTTP POST的body中傳遞非常大(比如幾M)的請求。那麼比如像nginx+php-fpm這樣的,就會佔用了服務器一個php進程專門處理這個請求,就會導致你對外無法提供其他的服務了,你的服務就癱瘓了,這就是DDOS攻擊。

其次是文件上傳服務考慮。

文件上傳有兩種情況:

你可能經常遇到爲什麼文件上傳失敗?那麼大多是上文說的幾個設置沒有設置對。

其次,文件上傳大小是不是設置越大越好?答案必須是否定的,理由也是安全考慮。滿足需求的大小限制就夠了。

這裏就可以理解爲什麼大都把文件上傳和業務接口分開來提供了吧。如果你的文件上傳服務和業務接口是同一個機器的話,那麼就說明你的業務接口可以允許的body大小一定是很大的。換句話說,在這種情境下,你的業務中的所有POST請求都是不安全的!!只要進行DDOS攻擊,業務就會癱瘓。



http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers

http://www.boutell.com/newfaq/misc/urllength.html

http://stackoverflow.com/questions/3326210/can-http-headers-be-too-big-for-browsers

http://admirestator.diandian.com/post/2012-04-28/19237704



發佈了59 篇原創文章 · 獲贊 24 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章