http://www.blogdaren.com/post-133.html
2013.11
雖然cURL支持多種協(xié)議,但日常我們最常用的還是HTTP協(xié)議,下文中著重介紹HTTP的相關(guān)使用方法,因此我們要對HTTP協(xié)議有所了解。
HTTP,超文本傳送協(xié)議,通過因特網(wǎng)傳送萬維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議。
我們訪問一個(gè)網(wǎng)頁的實(shí)際過程如下:
客戶端C===HTTP請求===>服務(wù)端S:GET index.html http/1.1客戶端C<==HTTP響應(yīng)====服務(wù)端S:HTTP/1.1 200 OK HTML文件內(nèi)容
HTTP協(xié)議本身是個(gè)無狀態(tài)協(xié)議,它不像其他基于會話的協(xié)議那樣去不斷追蹤、記憶事務(wù)處理過程。而它要做的就只是簡單的
連接=>發(fā)起HTTP請求(HTTP Request)=>得到HTTP響應(yīng)(HTTP Response)=>斷開連接
而平常我們通過瀏覽器瀏覽網(wǎng)頁這個(gè)過程,瀏覽器自動完成發(fā)送HTTP請求及對服務(wù)端應(yīng)答的數(shù)據(jù)進(jìn)行解析的工作,從而將網(wǎng)頁呈現(xiàn)給我們。
我們使用cURL要做的就是模仿瀏覽器的動作,因此要對HTTP請求的格式進(jìn)行進(jìn)一步的解析。
在你向HTTP服務(wù)器請求一個(gè)資源(比如簡單的使用瀏覽器打開一個(gè)網(wǎng)頁),TCP三次握手建立連接后,HTTP請求發(fā)出。
HTTP請求信息由3部分組成: l 請求行(Request Line) l 請求頭(Request Header) l 請求正文(Message Body)
1、HTTP請求行
典型的HTTP請求行格式為:
HTTP命令 請求資源的URI HTTP版本號
HTTP請求行例子如下:
GET / HTTP/1.1\r\n
這個(gè)請求行的意思是:請求得到(GET)/路徑下的默認(rèn)主頁文件,使用HTTP協(xié)議1.1版本。
根據(jù)HTTP標(biāo)準(zhǔn),HTTP請求可以使用多種請求方法。例如:HTTP1.1支持7種請求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。而服務(wù)器也可以自定義請求命令供客戶端使用。具體請參考HTTP的RFC文檔。而我們最常用的是GET和POST命令:
1)GET命令
GET主要用于取得URL指定的資源信息,也可用來提交表單。GET提交的信息實(shí)際上是附加在url之后作為URL的一部分。
當(dāng)年盛行一時(shí)的SQL注入,最常見的檢測手段就是在GET提交的鏈接后加單引號來檢測是否存在注入漏洞。
如提交username和password兩個(gè)字段,正常的GET網(wǎng)址如下:
http://www.xxx.com/login.php?username=user&password=pass
網(wǎng)站后臺就會在_GET數(shù)組中取得username和password的值,從而組建SQL語句:
select count(*) from user_table where username=user and password=pass
如果返回的count值大于0即為用戶名密碼正確。
而添加單引號后:
http://www.xxx.com/login.php?username=user&password=pass'
組建的SQL語句為
select count(*) from user_table where username=user and password=pass'
這個(gè)SQL語句執(zhí)行出錯(cuò),網(wǎng)頁顯示錯(cuò)誤信息,黑客從而得知網(wǎng)頁有SQL注入漏洞。
因此使用GET提交表單是不安全的,只進(jìn)行了簡單的編碼無法加密,可以很容易的從網(wǎng)址猜出各字段的意思。而且受限于URL長度限制,GET提交表單能攜帶的數(shù)據(jù)也有限。
2)POST命令
POST主要用于提交表單,尤其是提交大批量的表單數(shù)據(jù)。
POST方法克服了GET方法的一些缺點(diǎn)。通過POST方法提交表單數(shù)據(jù)時(shí),數(shù)據(jù)不是作為URL請求的一部分而是作為標(biāo)準(zhǔn)數(shù)據(jù)傳送給Web服務(wù)器,這就克服了GET方法中的信息無法加密和數(shù)據(jù)量太小的缺點(diǎn)。
HTTP請求的下一段數(shù)據(jù)為HTTP請求頭。
2、HTTP請求頭
HTTP請求頭中主要包含關(guān)于請求本身或者客戶端的有用信息,比如瀏覽器的類型、瀏覽器語言、編碼、壓縮算法等信息。服務(wù)器上的動態(tài)腳本如PHP等可以利用請求頭信息生成動態(tài)的網(wǎng)頁內(nèi)容。
典型的HTTP請求頭例子如下:
Connection: keep-aliveCache-Control: max-age=0User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19 QIHU 360EEAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Referer: http://www.adeploy.com/Accept-Encoding: gzip,deflate,sdchAccept-Language: zh-CN,zh;q=0.8Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
\r\n表示換行。由此可以看到HTTP請求頭是由幾行“屬性:值”對組成的,例如屬性Accept的值為*/*\r\n ,表示客戶端可以接受任意數(shù)據(jù)類型。
而我們最常用的是User-Agent字段和Referer字段,分別用于指定客戶端類型和來源頁面。
最末行額外多出的一對\r\n表示一個(gè)空白行,此空白行表示HTTP請求頭結(jié)束,以下部分為請求正文。
3、HTTP請求正文
HTTP請求正文經(jīng)常為空,除非需要向服務(wù)端提交信息,如在使用POST向網(wǎng)站提交表單的時(shí)候。
例如如下是一個(gè)完整的HTTP請求的例子:
GET / HTTP/1.1Host: www.adeploy.comConnection: keep-aliveCache-Control: max-age=0User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19 QIHU 360EEAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Referer: http://www.adeploy.com/Accept-Encoding: gzip,deflate,sdchAccept-Language: zh-CN,zh;q=0.8Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
當(dāng)收到HTTP請求之后,HTTP服務(wù)器會進(jìn)行處理然后返回一個(gè)HTTP響應(yīng)給客戶端(典型的客戶端為瀏覽器)。HTTP響應(yīng)中包含幾乎與HTTP請求同樣類型的數(shù)據(jù)。
HTTP響應(yīng)信息也由3部分組成: l 響應(yīng)行(Response Status Line) l 響應(yīng)頭(Response Header) l 響應(yīng)正文(Message Body)
響應(yīng)行以服務(wù)端使用的HTTP協(xié)議版本號開始,后加響應(yīng)狀態(tài)碼,表示請求結(jié)果狀態(tài),例如:
HTTP/1.1 200 OK
狀態(tài)碼200表示請求成功。
緊接著的是響應(yīng)頭。響應(yīng)頭與請求頭十分相似,也是由幾行“屬性:值”對組成。其中包含關(guān)于服務(wù)器的有用信息、響應(yīng)數(shù)據(jù)等。典型響應(yīng)頭如下:
Content-Type: text/html; charset=utf-8Cache-Control: no-cacheExpires: Fri, 01 Jan 1990 00:00:00 GMTContent-Encoding: gzipVary: Accept-EncodingDate: Tue, 31 Jul 2012 07:20:31 GMTServer: Google FrontendContent-Length: 10387
如果請求成功,響應(yīng)正文中將包含請求的數(shù)據(jù),如圖片文件的二進(jìn)制數(shù)據(jù)、HTML文件等。一旦響應(yīng)正文傳輸完畢,服務(wù)端又沒有使用HTTP 1.1版本的Keep-Alive請求,HTTP連接將會斷開。
Cookie是服務(wù)器為了辨別用戶身份、進(jìn)行session跟蹤用戶識別,而儲存在客戶端的數(shù)據(jù)。用以判斷在HTTP傳輸中的狀態(tài),從而彌補(bǔ)HTTP協(xié)議無狀態(tài)的缺陷。
比如我們登錄一個(gè)網(wǎng)站后,關(guān)閉網(wǎng)頁后重新打開網(wǎng)頁,服務(wù)端就可以通過cookie信息判斷我們曾經(jīng)登錄過,從而跳過重新登錄的過程,讓用戶感覺到親切、方便、人性化。
當(dāng)客戶端向服務(wù)端發(fā)起請求時(shí),瀏覽器會自動將cookie信息添加在HTTP請求頭中。例子如下:
Cookie: __utmc=90639562; __utma=90639562.1273157993.1343361841.1343361841.1343718828.2; __utmb=90639562.1.10.1343718828; __utmz=90639562.1343361841.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
在我們使用cURL時(shí),每次訪問網(wǎng)頁都相當(dāng)于瀏覽器打開關(guān)閉一次,因此cookie會起到很大的作用。
本篇介紹后續(xù)會使用的HTTP協(xié)議知識,只做簡要概括,具體請參考RFC文檔。
來自
地址:http://www.adeploy.com/2012/07/28/linux-curl-http-protocol.html