HTTP協議簡介
應用層協議,無狀態協議(可設定為維持TCP連線,但伺服器端的資源會釋放)。預設HTTP的埠號為80,HTTPS的埠號為443。
基於HTTP協議的客戶機訪問包括4個過程,分別是建立TCP套接字連線、傳送HTTP請求報文、接收HTTP應答報文和關閉TCP套接字連線。
請求報文格式:請求行、請求頭部和請求資料。
應答報文格式:狀態行、響應報頭、響應正文
HTTP請求方法
HTTP/1.1協議中共定義了八種方法來表明Request-URI指定的資源的不同操作方式,方法名稱是區分大小寫的:
HEAD 向伺服器索要與GET請求相一致的響應,只不過響應體將不會被返回。這一方法可以在不必傳輸整個響應內容的情況下,就可以獲取包含在響應訊息頭中的元資訊。
GET 向特定的資源發出請求。注意:GET方法不應當被用於產生“副作用”的操作中,例如在web app.中。其中一個原因是GET可能會被網路蜘蛛等隨意訪問。
GET請求報文示例:
GET http://www.baidu.com:80/ HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: www.baidu.com
Connection: Keep-Alive
GET應答報文示例:
HTTP/1.1 200 OK /* 狀態行 */
Via: 1.1 CVICSE-ST5YDEOY /* 狀態頭資訊 */
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Content-length: 9803
Expires: Fri, 02 Nov 2012 03:05:31 GMT
後邊是頁面內容等
POST 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
POST請求報文示例:
POST /sp.cgi HTTP/1.0
Host: www.spserver.com
Content-Length: <Content-Length>
<CommandId>=<4>
<SequenceNumber>=<205502327125025327>
<UserNumber>=<8613001125453>
<SPNumber>=<168>
<MessageContent>=<ABCD 1234>
POST應答報文示例:
HTTP/1.0 200 OK /* 狀態行 */
Date: Tue, 13 Mar 2001 02:45:12 GMT /* 狀態頭資訊 */
Server: Apache/1.3.12 (Unix)
Content-Type: text/html
Connection: close
後邊是POST實體資訊 /* 一般為POST實際傳輸的資訊*/
OPTIONS 返回伺服器針對特定資源所支援的HTTP請求方法。也可以利用向Web伺服器傳送'*'的請求來測試伺服器的功能性。
PUT 向指定資源位置上傳其最新內容。
DELETE 請求伺服器刪除Request-URI所標識的資源。
TRACE 回顯伺服器收到的請求,主要用於測試或診斷。
CONNECT HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。
HTTP協議欄位
Requests獨有部分:
Header |
解釋 |
示例 |
Accept |
指定客戶端能夠接收的內容型別 |
Accept: text/plain, text/html |
Accept-Charset |
瀏覽器可以接受的字元編碼集 |
Accept-Charset: iso-8859-5 |
Accept-Encoding |
指定瀏覽器可以支援的web伺服器返回內容壓縮編碼型別 |
Accept-Encoding: compress, gzip |
Accept-Language |
瀏覽器可接受的語言 |
Accept-Language: en,zh |
Accept-Ranges |
可以請求網頁實體的一個或者多個子範圍欄位 |
Accept-Ranges: bytes |
Authorization |
HTTP授權的授權證書,當使用密碼機制時用來標識瀏覽器 |
Authorization:Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cookie |
Cookie是在瀏覽器中寄存的小型資料體,它可以記載和伺服器相關的使用者資訊,也可以用來實現會話功能 |
JSESSIONID=DFB91E6D3B78AFD0270FDA90DA7062E1.isp5; CASSERVERPATH=http://192.168.2.19:8580 |
Content-Length |
請求的內容長度 |
Content-Length: 348 |
Content-Type |
請求的與實體對應的MIME資訊 |
Content-Type: application/x-www-form-urlencoded |
Expect |
客戶預期的響應狀態 |
Expect: 100-continue |
From |
發出請求的使用者的Email |
From: user@email.com |
Host |
指定請求的伺服器的域名和埠號 |
Host: www.zcmhi.com |
If-Match |
只有請求內容與實體相匹配才有效,供PUT方法使用 |
If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since |
如果請求的部分在指定時間之後被修改則請求成功,未被修改則返回304程式碼 |
If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match |
如果內容未改變返回304程式碼,引數為伺服器先前傳送的Etag,與伺服器回應的Etag比較判斷是否改變 |
If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range |
如果實體未改變,伺服器傳送客戶端丟失的部分,否則傳送整個實體。引數也為Etag |
If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since |
只在實體在指定時間之後未被修改才請求成功 |
If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards |
限制資訊通過代理和閘道器傳送的時間 |
Max-Forwards: 10 |
Proxy-Authorization |
連線到代理的授權證書 |
Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range |
只請求實體的一部分,指定範圍 |
Range: bytes=500-999 |
Referer |
先前網頁的地址,當前請求網頁緊隨其後,即來路 |
Referer: http://www.zcmhi.com/archives/71.html |
TE |
客戶端願意接受的傳輸編碼,並通知伺服器接受接受尾加頭資訊 |
TE: trailers,deflate;q=0.5 |
User-Agent |
User-Agent的內容包含發出請求的使用者資訊 |
User-Agent: Mozilla/5.0 (Linux; X11) |
Responses 獨有部分
Header |
解釋 |
示例 |
Accept-Ranges |
表明伺服器是否支援指定範圍請求及哪種型別的分段請求 |
Accept-Ranges: bytes |
Age |
從原始伺服器到代理快取形成的估算時間(以秒計,非負) |
Age: 12 |
Allow |
對某網路資源的有效的請求行為,不允許則返回405 |
Allow: GET, HEAD |
Content-Encoding |
web伺服器支援的返回內容壓縮編碼型別。 |
Content-Encoding: gzip |
Content-Language |
響應體的語言 |
Content-Language: en,zh |
Content-Length |
響應體的長度 |
Content-Length: 348 |
Content-Location |
請求資源可替代的備用的另一地址 |
Content-Location: /index.htm |
Content-MD5 |
返回資源的MD5校驗值 |
Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
Content-Range |
在整個返回體中本部分的位元組位置 |
Content-Range: bytes 21010-47021/47022 |
Content-Type |
返回內容的MIME型別 |
Content-Type: text/html; charset=utf-8 |
ETag |
請求變數的實體標籤的當前值 |
ETag: “737060cd8c284d8af7ad3082f209582d” |
Expires |
響應過期的日期和時間 |
Expires: Thu, 01 Dec 2010 16:00:00 GMT |
Last-Modified |
請求資源的最後修改時間 |
Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT |
Location |
用來重定向接收方到非請求URL的位置來完成請求或標識新的資源 |
Location: http://www.zcmhi.com/archives/94.html |
Proxy-Authenticate |
它指出認證方案和可應用到代理的該URL上的引數 |
Proxy-Authenticate: Basic |
refresh |
應用於重定向或一個新的資源被創造,在5秒之後重定向(由網景提出,被大部分瀏覽器支援) |
Refresh: 5; url= http://www.zcmhi.com/archives/94.html |
Retry-After |
如果實體暫時不可取,通知客戶端在指定時間之後再次嘗試 |
Retry-After: 120 |
Server |
web伺服器軟體名稱 |
Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) |
Set-Cookie |
設定Http Cookie |
Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 |
Vary |
告訴下游代理是使用快取響應還是從原始伺服器請求 |
Vary: * |
WWW-Authenticate |
表明客戶端請求實體應該使用的授權方案 |
WWW-Authenticate: Basic |
Requests/ Responses共有部分
Header |
解釋 |
示例 |
|
Cache-Control |
指定請求和響應遵循的快取機制 |
Cache-Control: no-cache |
|
Connection |
表示是否需要持久連線。(HTTP 1.1預設進行持久連線) |
Connection: close |
|
Date |
瀏覽器或者伺服器訊息發出的時間 |
Date: Tue, 15 Nov 2010 08:12:31 GMT |
|
Pragma |
包括實現特定的指令,它可應用到響應鏈上的任何接收方 |
Pragma: no-cache |
|
Trailer |
指出頭域在分塊傳輸編碼的尾部存在 |
Trailer: Max-Forwards |
|
Transfer-Encoding |
檔案傳輸編碼 |
Transfer-Encoding:chunked |
|
Upgrade |
向伺服器指定某種傳輸協議以便伺服器進行轉換(如果支援) |
Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
|
Via |
通知中間閘道器或代理伺服器地址,通訊協議 |
Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
|
Warning |
警告實體可能存在的問題 |
Warning: 199 Miscellaneous warning |
|
HTTP返回狀態碼
1xx:請求收到,繼續處理
2xx:操作成功收到,分析、接受
3xx:完成此請求必須進一步處理
4xx:請求包含一個錯誤語法或不能完成
5xx:伺服器執行一個完全有效請求失敗
100——客戶必須繼續發出請求
101——客戶要求伺服器根據請求轉換HTTP協議版本
200——交易成功
201——提示知道新檔案的URL
202——接受和處理、但處理未完成
203——返回資訊不確定或不完整
204——請求收到,但返回資訊為空
205——伺服器完成了請求,使用者代理必須復位當前已經瀏覽過的檔案
206——伺服器已經完成了部分使用者的GET請求
300——請求的資源可在多處得到
301——刪除請求資料
302——在其他地址發現了請求資料
303——建議客戶訪問其他URL或訪問方式
304——客戶端已經執行了GET,但檔案未變化
305——請求的資源必須從伺服器指定的地址得到
306——前一版本HTTP中使用的程式碼,現行版本中不再使用
307——申明請求的資源臨時性刪除
400——錯誤請求,如語法錯誤
401——請求授權失敗
402——保留有效ChargeTo頭響應
403——請求不允許
404——沒有發現檔案、查詢或URl
405——使用者在Request-Line欄位定義的方法不允許
406——根據使用者傳送的Accept拖,請求資源不可訪問
407——類似401,使用者必須首先在代理伺服器上得到授權
408——客戶端沒有在使用者指定的餓時間內完成請求
409——對當前資源狀態,請求不能完成
410——伺服器上不再有此資源且無進一步的參考地址
411——伺服器拒絕使用者定義的Content-Length屬性請求
412——一個或多個請求頭欄位在當前請求中錯誤
413——請求的資源大於伺服器允許的大小
414——請求的資源URL長於伺服器允許的長度
415——請求資源不支援請求專案格式
416——請求中包含Range請求頭欄位,在當前請求資源範圍內沒有range指示值,請求
也不包含If-Range請求頭欄位
417——伺服器不滿足請求Expect頭欄位指定的期望值,如果是代理伺服器,可能是下
一級伺服器不能滿足請求
500——伺服器產生內部錯誤
501——伺服器不支援請求的函式
502——伺服器暫時不可用,有時是為了防止發生系統過載
503——伺服器過載或暫停維修
504——關口過載,伺服器使用另一個關口或服務來響應使用者,等待時間設定值較長
505——伺服器不支援或拒絕支請求頭中指定的HTTP版本
常見攻擊和防禦手段,未整理完的
- SQL隱碼攻擊
- 跨站指令碼攻擊(XSS)
- 跨站請求偽造攻擊(CSRF)
- Http Heads攻擊
- DOS/DDOS
HTTP是基於傳輸層TCP協議的,而TCP是一個端到端的面向連線的協議
- 會話劫持
- HTTP身份驗證
- 每個欄位都可被用來攻擊,可以對欄位進行分安全級別,由使用者來選擇安全級別,高安全級別檢驗更多欄位。欄位內容,欄位長度
可以把http的攻擊按照不同階段進行羅列