- 黑客攻防從入門到精通(Web技術(shù)實戰(zhàn)篇)
- 明月工作室 王棟
- 9120字
- 2020-05-22 18:52:16
2.1 Web應(yīng)用程序使用的通信協(xié)議——HTTP協(xié)議
當(dāng)今Web程序的開發(fā)技術(shù)處于百家爭鳴的狀態(tài),有ASP.NET、PHP、JSP、Perl、AJAX等。無論Web技術(shù)在未來如何發(fā)展,理解Web應(yīng)用程序之間通信的基本協(xié)議相當(dāng)重要,因為它讓我們理解了Web應(yīng)用程序的內(nèi)部工作。本節(jié)將對HTTP協(xié)議進行詳細的實例講解。
2.1.1 什么是超文本傳輸協(xié)議HTTP
超文本傳輸協(xié)議(HTTP, HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,所有的WWW文件都必須遵守這個標(biāo)準(zhǔn)。設(shè)計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。1960年,美國人Ted Nelson構(gòu)思了一種通過計算機處理文本信息的方法,并稱之為超文本(Hypertext),這成為HTTP超文本傳輸協(xié)議標(biāo)準(zhǔn)架構(gòu)的發(fā)展根基。Ted Nelson組織協(xié)調(diào)萬維網(wǎng)協(xié)會(World Wide Web Consortium)和互聯(lián)網(wǎng)工程工作小組(Internet Engineering Task Force)共同合作研究,最終發(fā)布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。
HTTP協(xié)議的主要特點可概括如下。
(1)支持客戶/服務(wù)器模式。
(2)簡單快速。客戶向服務(wù)器請求服務(wù)時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
(3)靈活。HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
(4)無連接。無連接的含義是限制每次連接只處理一個請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。
(5)無狀態(tài)。HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)一方面意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大;另一方面,在服務(wù)器不需要先前信息時它的應(yīng)答就較快。
HTTP在TCP/IP協(xié)議棧中的位置如圖2-1所示。

圖2-1 HTTP在TCP/IP協(xié)議棧中的位置
2.1.2 統(tǒng)一資源定位器——URL
HTTP URL(URL是一種特殊類型的URI,包含了用于查找某個資源的足夠的信息)的格式如下:
http://host[":" port][abs_path]
其中,http表示要通過HTTP協(xié)議來定位網(wǎng)絡(luò)資源;host表示合法的Internet主機域名或者IP地址;port指定一個端口號,為空則使用默認端口80; abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那么當(dāng)它作為請求URI時,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成。例如:
1.輸入:www.guet.edu.cn 瀏覽器自動轉(zhuǎn)換成:http://www.guet.edu.cn/ 2.http://192.168.0.116:8080/index.jsp
2.1.3 HTTP請求
HTTP請求由三部分組成,分別是請求行、請求報頭、請求正文。
1.請求行
請求行以一個方法符號開頭,以空格分開,后面跟著請求的URI和協(xié)議的版本,格式如下:
Method Request-URI HTTP-Version CRLF
其中,Method表示請求方法;Request-URI是一個統(tǒng)一資源標(biāo)識符;HTTP-Version表示請求的HTTP協(xié)議版本;CRLF表示回車和換行(除了作為結(jié)尾的CRLF外,不允許出現(xiàn)單獨的CR或LF字符)。
請求方法(所有方法全為大寫)有多種,各個方法的解釋如下。
GET //請求獲取Request-URI所標(biāo)識的資源 POST //在Request-URI所標(biāo)識的資源后附加新的數(shù)據(jù) HEAD //請求獲取由Request-URI所標(biāo)識的資源的響應(yīng)消息報頭 PUT //請求服務(wù)器存儲一個資源,并用Request-URI作為其標(biāo)識 DELETE //請求服務(wù)器刪除Request-URI所標(biāo)識的資源 TRACE //請求服務(wù)器回送收到的請求信息,主要用于測試或診斷 CONNECT //保留將來使用 OPTIONS //請求查詢服務(wù)器的性能,或者查詢與資源相關(guān)的選項和需求
部分方法應(yīng)用舉例如下。
GET方法:在瀏覽器的地址欄中以輸入網(wǎng)址的方式訪問網(wǎng)頁時,瀏覽器采用GET方法向服務(wù)器獲取資源,例如:
GET /form.html HTTP/1.1(CRLF)
POST方法要求被請求服務(wù)器接受附在請求后面的數(shù)據(jù),常用于提交表單,例如:
POST /reg.jsp HTTP/ (CRLF) Accept:image/gif, image/x-xbit, ... (CRLF) ... HOST:www.guet.edu.cn (CRLF) Content-Length:22 (CRLF) Connection:Keep-Alive (CRLF) Cache-Control:no-cache (CRLF) (CRLF) //該CRLF表示消息報頭已經(jīng)結(jié)束,在此之前為消息報頭 user=jeffrey&pwd=1234 //此行以下為提交的數(shù)據(jù)
HEAD方法與GET方法幾乎是一樣的,對于HEAD請求的回應(yīng)部分來說,它的HTTP頭部中包含的信息與通過GET請求所得到的信息是相同的。利用這個方法,不必傳輸整個資源內(nèi)容,就可以得到Request-URI所標(biāo)識的資源的信息。該方法常用于測試超鏈接的有效性,是否可以訪問,以及最近是否更新。
2.請求報頭
當(dāng)我們打開一個網(wǎng)頁時,瀏覽器要向網(wǎng)站服務(wù)器發(fā)送一個HTTP請求報頭,然后網(wǎng)站服務(wù)器根據(jù)HTTP請求報頭的內(nèi)容生成當(dāng)次請求的內(nèi)容發(fā)送給瀏覽器。你明白HTTP請求報頭的具體含義嗎?下面先看某一次HTTP請求報頭的具體內(nèi)容。
Accept-Language: zh-cn, zh; q=0.5 Accept-Charset: GB2312, utf-8; q=0.7, *; q=0.7 Accept: text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8 Accept-Encoding: gzip, deflate User-Agent: Mozilla/5.0 (compatible; 域名) Host: 域名 Connection: Keep-Alive
根據(jù)以上HTTP請求內(nèi)容的先后順序一條條地解讀。
① Accept-Language: zh-cn, zh; q=0.5。
意思:瀏覽器支持的語言分別是中文和簡體中文,優(yōu)先支持簡體中文。
詳解:
Accept-Language表示瀏覽器所支持的語言類型。
zh-cn表示簡體中文;zh表示中文。
q是權(quán)重系數(shù),范圍0≤q≤1, q值越大,請求越傾向于獲得其“; ”之前的類型表示的內(nèi)容;若沒有指定q值,則默認為1;若被賦值為0,則用于提醒服務(wù)器哪些是瀏覽器不接受的內(nèi)容類型。
② Accept-Charset: GB2312, utf-8; q=0.7, *; q=0.7。
意思:瀏覽器支持的字符編碼分別是GB2312、utf-8和任意字符,優(yōu)先順序是GB2312、utf-8、*。
詳解:
Accept-Charset告訴Web服務(wù)器,瀏覽器可以接受哪些字符編碼。
GB2312是中國國家標(biāo)準(zhǔn)簡體中文字符集,全稱《信息交換用漢字編碼字符集·基本集》,又稱GB0,由中國國家標(biāo)準(zhǔn)總局發(fā)布,1981年5月1日開始實施。GB2312編碼通行于中國大陸,新加坡等地也采用此編碼。
utf-8是Unicode的一種變長字符編碼,又稱萬國碼,由Ken Thompson于1992年創(chuàng)建,現(xiàn)在已經(jīng)標(biāo)準(zhǔn)化為RFC 3629。
*表示任意字符編碼,雖然q都是等于0.7,但明確指定的GB2312、utf-8比*具有更高的優(yōu)先級。
③ Accept: text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8。
意思:瀏覽器支持的MIME類型分別是text/html、application/xhtml+xml、application/xml和 */*,優(yōu)先順序是它們從左到右的排列順序。
詳解:
Accept表示瀏覽器支持的MIME類型。
MIME的英文全稱是Multipurpose Internet Mail Extensions(多功能Internet郵件擴充服務(wù)),它是一種多用途網(wǎng)際郵件擴充協(xié)議,在1992年最早應(yīng)用于電子郵件系統(tǒng),但后來也應(yīng)用于瀏覽器。
text/html、application/xhtml+xml、application/xml都是MIME類型,也可以稱為媒體類型和內(nèi)容類型,斜杠前面的是type(類型),斜杠后面的是subtype(子類型); type指定大的范圍,subtype是type中范圍更明確的類型,即大類中的小類。
Text:用于標(biāo)準(zhǔn)化地表示的文本信息,文本消息可以是多種字符集和或者多種格式的。
text/html表示html文檔。
Application:用于傳輸應(yīng)用程序數(shù)據(jù)或者二進制數(shù)據(jù)。
application/xhtml+xml表示xhtml文檔。
application/xml表示xml文檔。
④ Accept-Encoding: gzip, deflate。
意思:瀏覽器支持的壓縮編碼是gzip和deflate。
詳解:
Accept-Encoding表示瀏覽器有能力解碼的編碼類型。
gzip是GNU zip的縮寫,它是一個GNU自由軟件的文件壓縮程序,也經(jīng)常用來表示gzip這種文件格式。
deflate是同時使用了LZ77算法與哈夫曼編碼(Huffman Coding)的一個無損數(shù)據(jù)壓縮算法。
⑤ User-Agent: Mozilla/5.0(compatible;域名)。
意思:使用的用戶代理是Mozilla/5.0(compatible;域名)。
詳解:
User-Agent(用戶代理),簡稱UA,它是一個特殊字符串頭,使得服務(wù)器能夠識別客戶端使用的操作系統(tǒng)及版本、CPU類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
Mozilla/5.0:Mozilla是瀏覽器名,版本是5.0。
compatible(兼容的)表示平臺是兼容模式。
⑥ Host: 域名。
Host表示請求的服務(wù)器網(wǎng)址。
⑦ Connection: Keep-Alive。
Connection表示客戶端與服務(wù)連接類型。
Keep-Alive表示持久連接。
3.請求正文
請求報頭和請求正文之間是一個空行,這個空行非常重要,它表示請求報頭已經(jīng)結(jié)束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字符串信息:
user=jeffrey&pwd=1234
在上例的HTTP請求中,請求的正文只有一行內(nèi)容。當(dāng)然,在實際應(yīng)用中,HTTP請求正文可以包含更多的內(nèi)容。
2.1.4 HTTP響應(yīng)
在接收和解釋請求消息后,服務(wù)器返回一個HTTP響應(yīng)消息。HTTP響應(yīng)也是由3個部分組成,分別是狀態(tài)行、響應(yīng)報頭、響應(yīng)正文。
1.狀態(tài)行
狀態(tài)行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務(wù)器HTTP協(xié)議的版本;Status-Code表示服務(wù)器發(fā)回的響應(yīng)狀態(tài)代碼;Reason-Phrase表示狀態(tài)代碼的文本描述。
狀態(tài)代碼由三位數(shù)字組成,第一個數(shù)字定義了響應(yīng)的類別,且有5種可能取值。
1xx:指示信息——表示請求已接收,繼續(xù)處理
2xx:成功——表示請求已被成功接收、理解、接受。
3xx:重定向——要完成請求必須進行更進一步的操作。
4xx:客戶端錯誤——請求有語法錯誤或請求無法實現(xiàn)。
5xx:服務(wù)器端錯誤——服務(wù)器未能實現(xiàn)合法的請求。
常見狀態(tài)代碼、狀態(tài)描述、說明。
200 OK //客戶端請求成功 400 Bad Request //客戶端請求有語法錯誤,不能被服務(wù)器理解 401 Unauthorized //請求未經(jīng)授權(quán),這個狀態(tài)代碼必須和WWW-Authenticate報 頭域一起使用 403 Forbidden //服務(wù)器收到請求,但是拒絕提供服務(wù) 404 Not Found //請求資源不存在,eg:輸入了錯誤的URL 500 Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯誤 503 Server Unavailable //服務(wù)器當(dāng)前不能處理客戶端的請求,一段時間后可能恢復(fù)正常 eg:HTTP/1.1200 OK(CRLF)
2.響應(yīng)報頭
理論上所有的響應(yīng)報頭信息都應(yīng)該是回應(yīng)請求報頭的,但是服務(wù)器端為了效率、安全,還有其他方面的考慮,會添加相對應(yīng)的響應(yīng)報頭信息。例如,訪問請求oschina首頁,響應(yīng)消息如下:
Response Headers view source Cache-Control:must-revalidate, no-cache, private Connection:keep-alive Content-Encoding:gzip Content-Type:text/html; charset=utf-8 Date:Sun,21 Sep 2014 06:18:20 GMT Expires:Sun,1 Jan 2000 01:00:00 GMT Pragma:no-cache Server:Tengine/1.4.6 Transfer-Encoding:chunked Vary:Accept-Encoding
從上例可以看出以下內(nèi)容。
① Cache-Control:must-revalidate, no-cache, private:這個值告訴客戶端,服務(wù)器端不希望客戶端緩存資源,在下次請求資源時,必須要重新請求服務(wù)器,不能從緩存副本中獲取資源。
Cache-Control是響應(yīng)報頭中很重要的信息,當(dāng)客戶端請求報頭中包含Cache-Control:max-age=0請求,明確表示不會緩存服務(wù)器資源時,Cache-Control作為回應(yīng)信息,通常會返回no-cache,意思就是說,“不緩存就不緩存唄”;當(dāng)客戶端在請求報頭中沒有包含Cache-Control時,服務(wù)器端往往會視不同的資源采用不同的緩存策略。例如,oschina在緩存圖片資源時的策略就是Cache-Control:max-age=86400,這個意思是,從當(dāng)前時間開始,在86400秒的時間內(nèi),客戶端可以直接從緩存副本中讀取資源,而不需要向服務(wù)器請求。Pragma:no-cache的含義與Cache-Control等同。
② Connection:keep-alive:這個字段作為回應(yīng)客戶端的Connection:keep-alive,告訴客戶端服務(wù)器的tcp連接也是一個長連接,客戶端可以繼續(xù)使用這個tcp連接發(fā)送HTTP請求。
③ Content-Encoding:gzip:告訴客戶端,服務(wù)器端發(fā)送的資源是采用gzip編碼的,客戶端看到這個信息后,應(yīng)該采用gzip對資源進行解碼。
④ Content-Type:text/html; charset=utf-8:告訴客戶端資源文件的類型,還有字符編碼,客戶端通過utf-8對資源進行解碼,然后對資源進行html解析。通常我們會看到有些網(wǎng)站是亂碼的,往往就是服務(wù)器端沒有返回正確的編碼。
⑤ Date:Sun, 21 Sep 2014 06:18:20 GMT,這個是服務(wù)器端發(fā)送資源時的服務(wù)器時間。HTTP協(xié)議中發(fā)送的時間都是GMT的,這主要是解決在互聯(lián)網(wǎng)上不同時區(qū)在相互請求資源的時候時間混亂問題。
⑥ Expires:Sun, 1 Jan 2000 01:00:00 GMT:這個響應(yīng)報頭也是跟緩存有關(guān)的,告訴客戶端在這個時間前,可以直接訪問緩存副本。很顯然這個值會存在問題,因為客戶端和服務(wù)器的時間不一定都是相同的,如果時間不同就會導(dǎo)致問題。所以這個響應(yīng)報頭是沒有Cache-Control:max-age=***這個響應(yīng)報頭準(zhǔn)確的,因為max-age=date中的date是個相對時間,不僅更好理解,也更準(zhǔn)確。
⑦ Server:Tengine/1.4.6:這個是指服務(wù)器和相對應(yīng)的版本,只是告訴客戶端服務(wù)器信息,沒有更多的意思。
⑧ Transfer-Encoding:chunked,這個響應(yīng)報頭告訴客戶端,服務(wù)器發(fā)送的資源的方式是分塊發(fā)送的。一般分塊發(fā)送的資源都是服務(wù)器動態(tài)生成的,在發(fā)送時還不知道發(fā)送資源的大小,所以采用分塊發(fā)送,每一塊都是獨立的,獨立的塊都能標(biāo)示自己的長度,最后一塊是0長度的,當(dāng)客戶端讀到這個0長度的塊時,就可以確定資源已經(jīng)傳輸完了。
⑨ Vary:Accept-Encoding:它告訴緩存服務(wù)器,緩存壓縮文件和非壓縮文件兩個版本。現(xiàn)在這個字段用處并不大,因為現(xiàn)在的瀏覽器都是支持壓縮的。
上面講述了訪問oschina時,服務(wù)器端發(fā)送回來的響應(yīng)報頭信息,但是并不全面。下面這些也是常常會出現(xiàn)的,也很重要。
① Content-leng:資源長度,如果服務(wù)器響應(yīng)報頭中沒有Transfer-Encoding:chunked,也就是說如果資源不是分塊傳輸?shù)模敲催@個字段就是必需的,因為如果服務(wù)器端不告訴客戶端資源的長度,那么在Connection:keep-alive,也就是說客戶端與服務(wù)器端是長連接時,客戶端就無法確定資源在什么時候結(jié)束。所以這個響應(yīng)報頭對于靜態(tài)資源是必需的。
② Content-Range:它告訴客戶端,這次發(fā)送的是資源的哪部門字節(jié),通常值為bytes 100-1000/5000。
③ Cookies:用于標(biāo)識客戶端,跟蹤客戶端,存儲用戶信息、用戶行為。
④ Location:服務(wù)器端將資源的真實目的放在這個響應(yīng)報頭中,引導(dǎo)客戶端重定向到這個地址去,如果服務(wù)器返回302,那么這個值是必需的,通常這個值是一個完整的url:www. oschina.net。
⑤ WWW-Authenticate:這個字段主要用在服務(wù)器資源是有訪問限制的,通常客戶端在訪問服務(wù)器資源時,服務(wù)器會返回401,要求客戶端發(fā)送認證信息,同時會告訴客戶端如何將認證信息編碼。這個響應(yīng)報頭的值就是存儲服務(wù)器告訴客戶端編碼的方式,通常是Basic-64編碼。
3.響應(yīng)正文
響應(yīng)正文就是服務(wù)器返回的資源的內(nèi)容。
2.1.5 HTTP消息報頭
HTTP消息由客戶端到服務(wù)器的請求和服務(wù)器到客戶端的響應(yīng)組成。請求消息和響應(yīng)消息都是由開始行(對于請求消息,開始行就是請求行;對于響應(yīng)消息,開始行就是狀態(tài)行)、消息報頭(可選)、空行(只有CRLF的行)、消息正文(可選)組成。
HTTP消息報頭包括普通報頭、請求報頭、響應(yīng)報頭和實體報頭。
每一個報頭域都是由名字+“:”+空格+值 組成,消息報頭域的名字是大小寫無關(guān)的。
1.普通報頭
在普通報頭中,有少數(shù)報頭域用于所有的請求和響應(yīng)消息,但并不用于被傳輸?shù)膶嶓w,只用于傳輸?shù)南ⅰ?/p>
eg:
Cache-Control用于指定緩存指令,緩存指令是單向的(響應(yīng)中出現(xiàn)的緩存指令在請求中未必會出現(xiàn)),且是獨立的(一個消息的緩存指令不會影響另一個消息處理的緩存機制), HTTP1.0使用的類似的報頭域為Pragma。
請求時的緩存指令包括no-cache(用于指示請求或響應(yīng)消息不能緩存)、no-store、max-age、max-stale、min-fresh、only-if-cached。
響應(yīng)時的緩存指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。
eg:為了指示IE瀏覽器(客戶端)不要緩存頁面,服務(wù)器端的JSP程序可以編寫如下:
response.sehHeader("Cache-Control", "no-cache"); //response.setHeader("Pragma", "no-cache");作用相當(dāng)于上述代碼,通常兩者合用
這句代碼將在發(fā)送的響應(yīng)消息中設(shè)置普通報頭域:Cache-Control:no-cache。
Date普通報頭域表示消息產(chǎn)生的日期和時間。
Connection普通報頭域允許發(fā)送指定連接的選項。例如,指定連接是連續(xù),或者指定close選項,通知服務(wù)器,在響應(yīng)完成后,關(guān)閉連接。
2.請求報頭
請求報頭允許客戶端向服務(wù)器端傳遞請求的附加信息以及客戶端自身的信息。
常用的請求報頭有以下幾種。
Accept請求報頭域用于指定客戶端接受哪些類型的信息。eg:Accept:image/gif,表明客戶端希望接受gif圖像格式的資源;Accept:text/html,表明客戶端希望接受html文本。
① Accept-Charset。
Accept-Charset請求報頭域用于指定客戶端接受的字符集。eg:Accept-Charset:iso-8859-1, gb2312。如果在請求消息中沒有設(shè)置這個域,默認是任何字符集都可以接受的。
② Accept-Encoding。
Accept-Encoding請求報頭域類似于Accept,但是它是用于指定可接受的內(nèi)容編碼。eg:Accept-Encoding:gzip.deflate。如果請求消息中沒有設(shè)置這個域,服務(wù)器假定客戶端對各種內(nèi)容編碼都可以接受。
③ Accept-Language。
Accept-Language請求報頭域類似于Accept,但是它是用于指定一種自然語言。eg:Accept-Language:zh-cn。如果請求消息中沒有設(shè)置這個報頭域,服務(wù)器假定客戶端對各種語言都可以接受。
④ Authorization。
Authorization請求報頭域主要用于證明客戶端有權(quán)查看某個資源。當(dāng)瀏覽器訪問一個頁面時,如果收到服務(wù)器的響應(yīng)代碼為401(未授權(quán)),可以發(fā)送一個包含Authorization請求報頭域的請求,要求服務(wù)器對其進行驗證。
⑤ Host(發(fā)送請求時,該報頭域是必需的)。
Host請求報頭域主要用于指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的,例如我們在瀏覽器中輸入:http://www.guet.edu.cn/index.html,瀏覽器發(fā)送的請求消息中,就會包含Host請求報頭域,如下:
Host: www.guet.edu.cn
此處使用默認端口號80,若指定了端口號,則變成Host:www.guet.edu.cn:指定端口號。
⑥ User-Agent。
我們上網(wǎng)登錄論壇的時候,往往會看到一些歡迎信息,其中列出了你的操作系統(tǒng)的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神奇,實際上,服務(wù)器應(yīng)用程序就是從User-Agent這個請求報頭域中獲取到這些信息。User-Agent請求報頭域允許客戶端將它的操作系統(tǒng)、瀏覽器和其他屬性告訴服務(wù)器。不過,這個報頭域不是必需的,如果我們自己編寫一個瀏覽器,不使用User-Agent請求報頭域,那么服務(wù)器端就無法得知我們的信息了。
請求報頭舉例。
GET /form.html HTTP/1.1 (CRLF) Accept:image/gif, image/x-xbitmap, image/jpeg, application/ x-shockwave-fl ash, application/vnd.ms-excel, application/vnd.ms- powerpoint, application/msword, */* (CRLF) Accept-Language:zh-cn (CRLF) Accept-Encoding:gzip, deflate (CRLF) If-Modified-Since:Wed,05 Jan 2015 11:21:25 GMT (CRLF) If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF) User-Agent:Mozilla/4.0(compatible; MSIE6.0; Windows NT 5.0) (CRLF) Host:www.guet.edu.cn (CRLF) Connection:Keep-Alive (CRLF) (CRLF)
3.響應(yīng)報頭
響應(yīng)報頭允許服務(wù)器傳遞不能放在狀態(tài)行中的附加響應(yīng)信息,以及關(guān)于服務(wù)器的信息和對Request-URI所標(biāo)識的資源進行下一步訪問的信息。
常用的響應(yīng)報頭有以下幾種。
① Location。
Location響應(yīng)報頭域用于重定向接受者到一個新的位置。Location響應(yīng)報頭域常用在更換域名的時候。
② Server。
Server響應(yīng)報頭域包含了服務(wù)器用來處理請求的軟件信息,與User-Agent請求報頭域是相對應(yīng)的。下面是Server響應(yīng)報頭域的一個例子。
Server: Apache-Coyote/1.1
③ WWW-Authenticate。
WWW-Authenticate響應(yīng)報頭域必須被包含在401(未授權(quán)的)響應(yīng)消息中,客戶端收到401響應(yīng)消息時,并發(fā)送Authorization報頭域請求服務(wù)器對其進行驗證時,服務(wù)端響應(yīng)報頭就包含該報頭域。
eg:WWW-Authenticate:Basic realm="Basic Auth Test! " //可以看出服務(wù)器對請求資源采用的是基本驗證機制。
4.實體報頭
請求和響應(yīng)消息都可以傳送一個實體。一個實體由實體報頭域和實體正文組成,但并不是說實體報頭域和實體正文要在一起發(fā)送,可以只發(fā)送實體報頭域。實體報頭定義了關(guān)于實體正文(eg:有無實體正文)和請求所標(biāo)識的資源的元信息。
常用的實體報頭有以下幾種。
① Content-Encoding。
Content-Encoding實體報頭域被用作媒體類型的修飾符,它的值指示了已經(jīng)被應(yīng)用到實體正文的附加內(nèi)容的編碼,因而要獲得Content-Type報頭域中所引用的媒體類型,必須采用相應(yīng)的解碼機制。Content-Encoding這樣用于記錄文檔的壓縮方法,例如:
Content-Encoding:gzip
② Content-Language。
Content-Language實體報頭域描述了資源所用的自然語言。沒有設(shè)置該域則認為實體內(nèi)容將提供給所有的語言閱讀者,例如:
Content-Language:da
③ Content-Length。
Content-Length實體報頭域用于指明實體正文的長度,以字節(jié)方式存儲的十進制數(shù)字來表示。
④ Content-Type。
Content-Type實體報頭域用于指明發(fā)送給接收者的實體正文的媒體類型。
Content-Type:text/html; charset=ISO-8859-1 Content-Type:text/html; charset=GB2312
⑤ Last-Modified。
Last-Modified實體報頭域用于指示資源的最后修改日期和時間。
⑥ Expires。
Expires實體報頭域給出響應(yīng)過期的日期和時間。為了讓代理服務(wù)器或瀏覽器在一段時間以后更新緩存中(再次訪問曾訪問過的頁面時,直接從緩存中加載,縮短響應(yīng)時間和降低服務(wù)器負載)的頁面,我們可以使用Expires實體報頭域指定頁面過期的時間,例如:
Expires:Thu,15 Sep 2015 16:23:12 GMT
HTTP1.1的客戶端和緩存必須將其他非法的日期格式(包括0)看作已經(jīng)過期。例如,為了讓瀏覽器不要緩存頁面,我們也可以利用Expires實體報頭域,設(shè)置為0, jsp中程序如下:
response.setDateHeader("Expires", "0");
2.1.6 利用Telnet觀察HTTP協(xié)議的通信過程
實驗?zāi)康募霸砣缦隆?/p>
利用MS的Telnet工具,通過手動輸入HTTP請求信息的方式,向服務(wù)器發(fā)出請求,服務(wù)器接收、解釋和接受請求后,會返回一個響應(yīng),該響應(yīng)會在Telnet窗口上顯示出來,從而從感性上加深對HTTP協(xié)議的通信過程的認識。
實驗步驟如下。
1.打開Telnet
步驟1 單擊電腦桌面左下角的“開始”按鈕。
步驟2 在輸入框中輸入“cmd”。
步驟3 單擊程序cmd.exe。
步驟4 在顯示的界面中輸入“telnet”,按回車鍵,進入telnet操作界面,如圖2-2所示。

圖2-2 打開Telnet操作界面
步驟5 在操作界面中輸入“set localecho”,按下回車鍵,打開telnet回顯功能,如圖2-3所示。

圖2-3 打開Telnet回顯功能
2.連接服務(wù)器并發(fā)送請求
open www.guet.edu.cn 80 //注意端口號不能省略 HEAD /index.asp HTTP/1.0 Host:www.guet.edu.cn /*我們可以變換請求方法,請求桂林電子主頁內(nèi)容,輸入消息如下*/ open www.guet.edu.cn 80 GET /index.asp HTTP/1.0 //請求資源的內(nèi)容 Host:www.guet.edu.cn open www.sina.com.cn 80 //在命令提示符號下直接輸入telnet www. sina.com.cn 80 HEAD /index.asp HTTP/1.0 Host:www.sina.com.cn
3.實驗結(jié)果
第一個請求信息得到的響應(yīng)如下:
HTTP/1.1200 OK //請求成功 Server: Microsoft-IIS/5.0 //web服務(wù)器 Date: Thu,08 Mar 201507:17:51 GMT Connection: Keep-Alive Content-Length: 23330 Content-Type: text/html Expries: Thu,08 Mar 2015 07:16:51 GMT Set-Cookies: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/ Cache-control: private //資源內(nèi)容省略
第二個請求信息得到的響應(yīng)是如下:
HTTP/1.0404 Not Found //請求失敗 Date: Thu, 08 Mar 2015 07:50:50 GMT Server: Apache/2.0.54 <Unix> Last-Modified: Thu, 30 Nov 2015 11:35:41 GMT ETag: "6277a-415-e7c76980" Accept-Ranges: bytes X-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remix Vary: Accept-Encoding Content-Type: text/html X-Cache: MISS from zjm152-78.sina.com.cn Via: 1.0 zjm152-78.sina.com.cn:80<squid/2.6.STABLES-20061207> X-Cache: MISS from th-143.sina.com.cn Connection: close 失去了跟主機的連接 按任意鍵繼續(xù)...
4.注意事項
① 出現(xiàn)輸入錯誤,則請求不會成功。
② 報頭域不分大小寫。
③ 更深一步了解HTTP協(xié)議,可以查看RFC2616,在http://www.letf.org/rfc上找到該文件。
④ 開發(fā)后臺程序必須掌握HTTP協(xié)議。
2.1.7 HTTP協(xié)議相關(guān)技術(shù)補充
1.基礎(chǔ)
高層協(xié)議有:文件傳輸協(xié)議FTP、電子郵件傳輸協(xié)議SMTP、域名系統(tǒng)服務(wù)DNS、網(wǎng)絡(luò)新聞傳輸協(xié)議NNTP和HTTP協(xié)議等。
中介有3種:代理(Proxy)、網(wǎng)關(guān)(Gateway)和通道(Tunnel)。一個代理根據(jù)URI的絕對格式來接受請求,重寫全部或部分消息,通過URI的標(biāo)識把已格式化過的請求發(fā)送到服務(wù)器。網(wǎng)關(guān)是一個接收代理,作為一些其他服務(wù)器的上層,并且如果必需的話,可以把請求翻譯給下層的服務(wù)器協(xié)議。一個通道作為不改變消息的兩個連接之間的中繼點。當(dāng)通信需要通過一個中介(如防火墻等)或者是中介不能識別消息的內(nèi)容時,通道經(jīng)常被使用。
代理(Proxy):一個中間程序,它可以充當(dāng)一個服務(wù)器,也可以充當(dāng)一個客戶機,為其他客戶機建立請求。請求是通過可能的翻譯在內(nèi)部或經(jīng)過傳遞到其他的服務(wù)器中。一個代理在發(fā)送請求信息之前,必須解釋并且如果可能重寫它。代理經(jīng)常作為通過防火墻的客戶機端的門戶,另外還可以作為一個幫助應(yīng)用來通過協(xié)議處理沒有被用戶代理完成的請求。
網(wǎng)關(guān)(Gateway):一個作為其他服務(wù)器中間媒介的服務(wù)器。與代理不同的是,網(wǎng)關(guān)接受請求就好像對被請求的資源來說它就是源服務(wù)器;發(fā)出請求的客戶機并沒有意識到它在同網(wǎng)關(guān)打交道。
網(wǎng)關(guān)經(jīng)常作為通過防火墻的服務(wù)器端的門戶,另外還可以作為一個協(xié)議翻譯器以便存取那些存儲在非HTTP系統(tǒng)中的資源。
通道(Tunnel):作為兩個連接中繼的中介程序。一旦激活,通道便被認為不屬于HTTP通信,盡管通道可能是被一個HTTP請求初始化的。當(dāng)被中繼的連接兩端關(guān)閉時,通道便消失。當(dāng)一個門戶(Portal)必須存在或中介(Intermediary)不能解釋中繼的通信時通道被經(jīng)常使用。
2.協(xié)議分析的優(yōu)勢——HTTP分析器檢測網(wǎng)絡(luò)攻擊
以模塊化的方式對高層協(xié)議進行分析處理,將是未來入侵檢測的方向。HTTP及其代理的常用端口80、3128和8080在network部分用port標(biāo)簽進行了規(guī)定。
3.HTTP協(xié)議Content Lenth限制漏洞導(dǎo)致拒絕服務(wù)攻擊
使用POST方法時,可以設(shè)置Content Lenth來定義需要傳送的數(shù)據(jù)長度,如Content Lenth:999999999,在傳送完成前,內(nèi)存不會釋放,攻擊者可以利用這個缺陷,連續(xù)向Web服務(wù)器發(fā)送垃圾數(shù)據(jù)直至Web服務(wù)器內(nèi)存耗盡。這種攻擊方法基本不會留下痕跡。
4.利用HTTP協(xié)議的特性進行拒絕服務(wù)攻擊的一些構(gòu)思
服務(wù)器端忙于處理攻擊者偽造的TCP連接請求而無暇理睬客戶的正常請求(畢竟客戶端的正常請求比率非常之小),此時從正常客戶的角度看來,服務(wù)器失去響應(yīng),這種情況我們稱為服務(wù)器端受到了SYN Flood攻擊(SYN洪水攻擊)。
而Smurf、TearDrop等是利用ICMP報文來Flood和IP碎片攻擊的。本文用“正常連接”的方法來產(chǎn)生拒絕服務(wù)攻擊。
19端口在早期已經(jīng)有人用來做Chargen攻擊了,即Chargen_Denial_of_Service,但是他們用的方法是在兩臺Chargen服務(wù)器之間產(chǎn)生UDP連接,讓服務(wù)器處理過多信息而DOWN掉,那么,干掉一臺Web服務(wù)器的條件就必須有兩個:一是有Chargen服務(wù),二是有HTTP服務(wù)。
方法:攻擊者偽造源IP給N臺Chargen發(fā)送連接請求(Connect), Chargen接收到連接后就會返回每秒72字節(jié)的字符流(實際上根據(jù)網(wǎng)絡(luò)實際情況,這個速度更快)給服務(wù)器。
5.HTTP指紋識別技術(shù)
HTTP指紋識別的原理大致上也是相同的:記錄不同服務(wù)器對HTTP協(xié)議執(zhí)行中的微小差別進行識別。HTTP指紋識別比TCP/IP堆棧指紋識別復(fù)雜許多,理由是定制HTTP服務(wù)器的配置文件、增加插件或組件使得更改HTTP的響應(yīng)信息變得很容易,這樣使得識別變得困難;然而定制TCP/IP堆棧的行為需要對核心層進行修改,所以就容易識別。
要讓服務(wù)器返回不同的Banner信息的設(shè)置是很簡單的,像Apache這樣的開放源代碼的HTTP服務(wù)器,用戶可以在源代碼里修改Banner信息,然后重啟HTTP服務(wù)就生效了;對于沒有公開源代碼的HTTP服務(wù)器,如微軟的IIS或者是Netscape,可以在存放Banner信息的Dll文件中修改,另外一種模糊Banner信息的方法是使用插件。
常用測試請求如下。
① HEAD/HTTP/1.0發(fā)送基本的HTTP請求。
② DELETE/HTTP/1.0發(fā)送那些不被允許的請求,如Delete請求。
③ GET/HTTP/3.0發(fā)送一個非法版本的HTTP協(xié)議請求。
④ GET/JUNK/1.0發(fā)送一個不正確規(guī)格的HTTP協(xié)議請求。
HTTP指紋識別工具Httprint,它通過運用統(tǒng)計學(xué)原理,組合模糊的邏輯學(xué)技術(shù),能很有效地確定HTTP服務(wù)器的類型。它可以被用來收集和分析不同HTTP服務(wù)器產(chǎn)生的簽名。
6.其他
為了提高瀏覽器在被用戶使用時的性能,現(xiàn)代瀏覽器還支持并發(fā)的訪問方式,瀏覽一個網(wǎng)頁時同時建立多個連接,以迅速獲得一個網(wǎng)頁上的多個圖標(biāo),這樣能更快速完成整個網(wǎng)頁的傳輸。
HTTP 1.1中提供了這種持續(xù)連接的方式,而下一代HTTP協(xié)議——HTTP-NG更增加了有關(guān)會話控制、豐富的內(nèi)容協(xié)商等方式的支持,來提供更高效率的連接。
- 科技安全:戰(zhàn)略實踐與展望
- 網(wǎng)絡(luò)安全保障能力研究
- 網(wǎng)絡(luò)安全應(yīng)急管理與技術(shù)實踐
- 開發(fā)者的Web安全戒律:真實威脅與防御實踐
- Enterprise Cloud Security and Governance
- 模糊測試:強制發(fā)掘安全漏洞的利器
- 數(shù)據(jù)安全與隱私計算(第3版)
- Applied Network Security
- 網(wǎng)絡(luò)安全能力成熟度模型:原理與實踐
- Disaster Recovery Using VMware vSphere Replication and vCenter Site Recovery Manager
- 網(wǎng)絡(luò)空間安全導(dǎo)論
- 聯(lián)邦學(xué)習(xí)原理與算法
- 基于數(shù)據(jù)科學(xué)的惡意軟件分析
- 防火墻和VPN技術(shù)與實踐
- 業(yè)務(wù)安全關(guān)鍵技術(shù)與應(yīng)用實踐