HTTP請求方法及響應碼詳解(http get post head)


HTTP是Web協議集中的重要協議,它是從客戶機/服務器模型發展起來的。客戶機/服務器是運行一對相互通信的程序,客戶與服務器連接時,首先,向服務 器提出請求,服務器根據客戶的請求,完成處理並給出響應。瀏覽器就是與Web服務器產生連接的客戶端程序,它的端口為TCP的80端口,。瀏覽器與Web 服務器之間所遵循的協議就是HTTP。

HTTP的早期版本為HTTP/0.9,它適用於各種數據信息的簡潔快速協議,但是其遠不能滿足日益發展各種應用的需要。 但HTTP/0.9作為HTTP協議具有典型的無狀態性:每個事務都是獨立進行處理的,當一個事務開始就在客戶與服務器之間建立一個連接,當事務結束時就 釋放這個連接。HTTP/0.9包含Simple-Request&Simple-Responsed的報文結構。但是客戶無法使用內容協商,所 以服務器也無法返回實體的媒體類型。

1982年,Tim Berners-Lee提出了HTTP/1.0,在此后的不斷豐富和發展中,HTTP/1.0成為最重要的面向事務的應用層協議。該協議對每一次請求/響 應,建立並拆除一次連接。其特點是簡單、易於管理,所以它符合了大家的需要,得到了廣泛的應用。其缺點是仍會發生下列問題:對用戶請求響應慢、網絡擁塞嚴 重、安全性等。

1997年形成的HTTP/1.1,也就是現在普遍使用的協議,在持續連接操作機制中實現流水方式,即客戶端需要對同一服務器 發出多個請求時,其實現在多數的網頁都是有多部分組成(比如多張圖片),可用流水線方式加快速度,流水機制就是指連續發出多個請求並等到這些請求發送完 畢,再等待響應。這樣就大大節省了單獨請求對響應的等待時間,使我們得到更快速的瀏覽。

另外,HTTP/1.1服務器端處理請求時按照收到的順序進行,這就保證了傳輸的正確性。當然,服務器端在發生連接中斷時,會自動的重傳請求,保證數據的完整性。

HTTP/1.1還提供了身份認證、狀態管理和Cache緩存等機制。這里,我想特別提一下關於HTTP/1.1中的Cache緩存機制對 HTTP/1.0的不足之處的改進,它嚴格全面,既可以減少時間延遲、又節省了帶寬。HTTP/1.1采用了內容協商機制,選擇最合適的用戶的內容表現形 式。

現在,很多地方都有用到的虛擬主機技術在HTTP/1.1中也可以實現。所謂的虛擬主機技術,就是同一主機地址實際對應多台主機。通俗的 講,當你同時在一個網站申請兩個主頁時,用協議分析儀可以發現其實這兩個主頁對應的是同一個IP地址。這樣用多台完全相同的機器形成WWW服務器就可以提 高處理的吞吐量。

傳統的解決方案是改造域名服務器使其可以根據一定的算法將同一域名解釋成不同的IP地址。分別對應虛擬主機的每台機器,其缺點是要求每台機器占用完全獨立的IP地址,這與IP地址的缺乏是相矛盾的。
HTTP/1.1提供的解決方案在HTTP協議自身中加入了指定不同主機的功能,從而多台主機可以共享一個IP地址,既提高了性能又便於管理。

因為HTTP/1.1是Internet現行的標准協議,這里詳細介紹其相關語法。

首先,HTTP/1.1格式可寫為: 
其中請求方法是請求一定的Web頁面的程序或用於特定的URL。可選用下列幾種:
GET: 請求指定的頁面信息,並返回實體主體。
HEAD: 只請求頁面的首部。
POST: 請求服務器接受所指定的文檔作為對所標識的URI的新的從屬實體。
PUT: 從客戶端向服務器傳送的數據取代指定的文檔的內容。
DELETE: 請求服務器刪除指定的頁面。
OPTIONS: 允許客戶端查看服務器的性能。
TRACE: 請求服務器在響應中的實體主體部分返回所得到的內容。
PATCH: 實體中包含一個表,表中說明與該URI所表示的原內容的區別。
MOVE: 請求服務器將指定的頁面移至另一個網絡地址。
COPY: 請求服務器將指定的頁面拷貝至另一個網絡地址。
LINK: 請求服務器建立鏈接關系。
UNLINK: 斷開鏈接關系。
WRAPPED: 允許客戶端發送經過封裝的請求。
Extension-mothed:在不改動協議的前提下,可增加另外的方法。
比如:
GET /index.html HTTP/1.1
Accept: text/plain /*純ASCII碼文本文件*/
Accept: text/html /*HTML文本文件*/
User-Agent:Mozilla/4.5(WinNT)
說明瀏覽器使用Get方法請求文檔/index.html。瀏覽器則只允許接收純ASCII碼文本文件和HTML文本文件,其使用的引擎是Mozilla/4.5(Netscape)。

當服務器響應時,其狀態行的信息為HTTP的版本號,狀態碼,及解釋狀態碼的簡單說明。現將5類狀態碼詳細列出:
① 客戶方錯誤
100  繼續
101  交換協議
② 成功
200  OK
201  已創建
202  接收
203  非認證信息
204  無內容
205  重置內容
206  部分內容
③ 重定向
300  多路選擇
301  永久轉移
302  暫時轉移
303  參見其它
304  未修改(Not Modified)
305  使用代理
④ 客戶方錯誤
400  錯誤請求(Bad Request)
401  未認證
402  需要付費
403  禁止(Forbidden)
404  未找到(Not Found)
405  方法不允許
406  不接受
407  需要代理認證
408  請求超時
409  沖突
410  失敗
411  需要長度
412  條件失敗
413  請求實體太大
414  請求URI太長
415  不支持媒體類型
⑤ 服務器錯誤
500  服務器內部錯誤
501  未實現(Not Implemented)
502  網關失敗
504  網關超時
505 HTTP版本不支持
比如:(在《TELNET……》一文中用telnet登陸80端口,相同的方法用在HTTP/1.1中,會發現沒有顯示,下面補充說明之)
telnet www.fudan.edu.cn 80
HEAD / HTTP/1.1
host:www.fudan.edu.cn /*本行為輸入內容*/
HTTP/1.1 501 Method Not Implemented
Date: Web, 01 Nov 2000 07:12:29 GMT /*當前的日期/時間*/
Server: Apache/1.3.12 (Unix) /*Web服務器信息*/
Allow: GET, HEAD, OPTION, TRACE /*支持的方法類型*/
Connection: close 
Connect-Type: Text/html; charset=iso-8859-1/*連接的媒體類型*/

<!DOCTYPE HTML PUBLIG "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>501 Method
Not Implemented</TITLE>
</HEAD><BODY>
<H1>Method Not Implemented</H1>
head to /inde
x.html not supported.<P>
Invalid method in request head / htp/1.1<P>
<HR>
<ADDRESS>
Apache/1.3.12 Server at www.fudan.edu.cn Port 80</ADDRESS>
</BODY></HTML>
關於實體頭部的內容還可以有:
Last Modified :請求文檔的最近修改時間。
Expires :請求文檔的過期時間。
Connect-length:文檔數據的長度。
WWW-authenricate:通知客戶端需要的認證信息。 
Connect-encoding :說明有無使用壓縮技術。
Transfer-encoding :說明采用的編碼變換類型。

隨着Internet的發展,下一代的HTTP協議HTTP-ng已經在醞釀之中,它將會提供更好的安全性、更快的速度,其改進要點為:模塊化強、網絡效率高、安全性更好、結構更簡單。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1759249

http 是一個相對簡單的協議,它定義了客戶(通常通過瀏覽器)和www服務器之間的會話過程。現在我們來看看這個會話過程的簡要說明:客戶打開與服務器的套接,使用的端口通常是80。然后它服務器發送請求行,請求標題,最后是請求空行。客戶的請求通常是請求文檔,它可以是文本文件,圖片或者是程序等。服務器接受這個請求,然后查找請求的數據,最后根據查找的結果做出響應。如果上面的過程是一個cgi程序的話,那么服務器將會執行這個程序,並將程序執行的結果輸給客戶端。所以不明白cgi程序的朋友,可以這樣理解cgi程序,它可以用很多的語言來寫,只要它能完成一個任務:分析客戶請求行中的數據,然后代替服務器做出響應!我們今天要討論的就是從客戶端的角度來理解這個問題,首先來看一個標准的客戶請求格式: 
請求方法 文擋地址 http/版本 
請求標題:數據1 
……………. 
請求標題:數據N 
空白行 
在上面的格式中,第一行是必須的,它指明請求的文擋,又稱請求頭。下面的是請求標題可以多個。最后的空白行表示終止。這里還有一個問題,如果請求方法是POST的話那么空白行后面還可以發送附加數據。這里有一個非常重要的問題就是請求方法。無論對於我們cgi新手還是喜歡web安全的朋友,都是必須的知識 
這是一個典型的請求頭: 
GET /bbs/login.asp HTTP/1.0 
其中GET就是一個請求方法。/bbs/login.asp是文擋的地址即URI,它是URL的一部分。HTTP/1.0 是http 協議的版本號。這種方式的請求是建立在已經和服務器的套接建立的基礎上的。完整的URL 可以是這樣的方式:http://www.target.com/bbs/login.asp 。在http 1.0的協議里定義了三種請求方式:GET,POST,HEAD。http 1.1又補充了一些,如PUT,DELETE,OPTIONS和TRACE。現在也越來越多的服務器支持這些方法。下面我們來介紹一下常用的方法。 
GET 這個是瀏覽器用語向服務器請求最常用的方法。我們在瀏覽器上發送的URL就是一個GET請求,當然我們也可以用程序,比如netcat,webget等來做。我們有的時候在看到一些黑客高手們在文章中提到的一些請求的例子,可能新手朋友們很難理解,比如: 
http://www.target.com/bbsxp165/bbsxp/searc...password)>1)   
這就是一個相當復雜的GET請求,/searchok.asp?是請求這個asp文件,后面就是要傳輸給這個程序的數據,這個數據是根據網頁的交互固定的。服務器接受這個請求后這些數據將被放入環境變量QUERY_STRING中。數據通常是一些數據名/數據值對。沒對數據名/數據值之間用&來分開。例子的提交里forumid=()空格里的是一個sql語句,這是由於這里存在sql injection漏洞,當然不在我們討論的范圍。還有GET請求的數據不能超過一個特定的長度,比如2000字節。 
POST 這個方法也是用來傳送數據的,但是與GET不同的是,使用POST的時候,數據不是附在URI后面傳遞的,而是要做為獨立的行來傳遞,此時還必須要發送一個Content_length標題,以標明數據長度,隨后一個空白行,然后就是實際傳送的數據。網頁的表單通常是用POST來傳送的。這里我們來舉兩個安全人士常用的提交方式,通常就是黑客們所謂的發現某個網頁的或者某個cgi程序的漏洞然后構造一個特殊請求的時候用的: 
1,腳本實現 
………… 
$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => "tcp", Type => SOCK_STREAM) or die “can’t connect to the host\n”; 
print $socket "POST /$b HTTP/1.1\r\n"; 
print $socket "Host: $host\r\n"; 
print $socket "Content-Type: text/xml\r\n"; 
print $socket "Content-length: $length\r\n\r\n"; 
print $socket "$data\r\n"; 
$socket->recv($rbuf,500); 
close($socket); 
………. 
以上是perl程序POST提交的主體部分,比如一個溢出程序,關鍵的地方就在於$b(URI)和$data 的構造上! 
2, 使用nc來提交 
建立一個hack.txt的文件輸入下面的內容: 
POST /cgi-bin/websendmail HTTP/1.0 
Content-length: xxx (should be replaced with the actual length of the 
string passed to the server, in this case xxx=90) 
receiver=;mail+your_address\@somewhere.org   
然后用nc來請求 
nc www.victim.com 80 <hack.txt 
這樣就完成了一個post的提交,當然還有很多別的方法可以實現這個提交,這里只是舉兩個我認為方便的辦法。 
HEAD 方法和GET的語法是一樣的,如果用HEAD方法請求的話,則服務器返回的只是響應標題,而不會返回被請求的文擋,HEAD方法通用於一些搜索引擎中,當然我們的cgi掃描軟件很多都是使用這個方式請求的。 
以下方法屬於http 1.1的標准,我們目前使用的還少,簡單的介紹一下定義。 
PUT 可以將客戶提交的文擋保存在服務器的URI上 
DELETE 用於請求服務器刪除指定的URI 
OPTIONS 可以請求對於指定URI可用的通用選項信息 
TRACE請求服務器將附加的文擋無變更的返回,主要用於調試。 
提到了請求,自然要講一下,服務器的響應了,它的標准格式如下 
HTTP/版本號 狀態碼 消息 
響應標題:數據1 
…………. 
響應標題:數據N 
空白行 
客戶提交的文擋 
看個例子吧: 
nc www.victim.com 80 
GET /index.html   
HTTP/1.1 400 Bad Request   
Date: Tue, 14 May 2002 07:03:02 GMT   
Server: Apache   
Connection: close   
Transfer-Encoding: chunked   
Content-Type: text/html; charset=iso-8859-1   

127 
…………… 
響應預定義的狀態碼有很多,通常是服務器默認的設置,是三位數,以1,2,3,4,5開頭的 
1xx 主要用於調試和實驗的目的   
2xx 主要表示請求成功   
3xx 表示請求的uri有多個選擇或者已經移動位置了   
4xx 400表示請求行中有語法錯誤,404表示文擋不存在 
5xx 表示服務器內部錯誤 
有的時候可能大家總是忽略了這些東西的做用,事實上有的時候他們的作用還真的不小,比如我們手頭沒有任何工具,如何知道服務器上是否有ida,printf等映射呢,我們可以這么請求:http://www.victim.com/*.ida 如果出現500 服務器內部錯誤,我想問題就已經很清楚了。 
既然都說這么多的廢話了,那么再給大家來點關於URL編碼,數據傳輸的小知識,和cookies的一些介紹吧。 
URL編碼和數據傳輸 
下面是一個例子: 
http://www1.baidu.com/baidu?word=netcat+ex...gb2312&cl=3&f=1 
通常我們的瀏覽器在發送數據的時候要先經過編碼,這是一種規范。GET 和POST 都是一樣的,當然對於表單你可以用enctype字段來規定其他的編碼方式。上面的例子語法,格式是用HEAD請求的。我們看到其中有一些特殊的符號如”%”,這是由於當數據中有非字母或數據的字符時,URL編碼會將該字符轉化為其ASCII碼對應的數字,這樣便以一個兩位數字的16進制編碼來代表字符。在 URL 編碼中由百分號指示。 因此,%25 表示百分號本身(25是十六進制的,就是以 16 為基,代表百分號的 ASCII 碼值),所有127(7fhex) 以上,和 33 (21hex) 以下的所有字符都會被轉義,這包含空格符,空格的轉義符為 %20. 加號被解釋為空格符。 
cookies 內容簡介 
cookies的作用,這里我就不說了,光是對它語法和格式本身就進介紹,我們先來看一個cookies的例子 
aspsky 
userhidden=2&password=469e80d32c0559f8&userid=1&userclass=%B9%DC%C0%ED%D4%B1&username=admin& usercookies=1 
localhost/bbs/ 

3061727232 
29562033 
2222055456 
29561914 

參考這個例子我們來看看cookies 的 properties 主要包括: 
key -->aspsky 
value-->userhidden=2&password=469e80d32c0559f8&userid=1&userclass=%B9%DC%C0%ED%D4%B1&usernam e=admin&usercookies=1 
damain-->localhost/bbs/ 
secure-->0 相當於no 
expire-->3061727232 29562033 有效時間需要解碼才能讀出來 
modified-->3061727232 29562033 修改時間,解碼方式和expire一樣 
created in ->server 
有的時候還有ip address 
以上這些介紹只是方便大家對cookies的理解,具體的請參考一些專業的資料。有的時候經常遇到一些朋友問起怎么偽造cookies,我想寫到這里已經非常清楚了。 
說了這么多,總結一下吧 
如果你是一個新手的話,如果你對http協議不是很清楚的話,建議你好好讀讀一些資料,畢竟這個是我們一天到晚泡網的基礎哦,如果你是一個和我一樣,喜歡研究網絡編程安全的朋友,那么希望我們能一起交流,一起進步。本文只是簡單的介紹了一下http方面的一些基礎知識,並沒有深入的講述,在一定程 度上說只是給新手朋友們一個概念,但是對於大家理解在網絡一些高手的精彩文章,還是相當有用的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM