好好說道下Http協議

無狀態的Http協議

http協議的最新版本是1.1。是一種無狀態協議。javascript

什麼是無狀態協議?

無狀態協議是指web瀏覽器與web服務器之間不須要創建持久連接。當客戶端向服務器端發送請求(Request)時,服務器響應客戶端的請求(Response),連接就被關閉了,在服務器端不保留連接的有關信息。也就是說http請求只能由客戶端發起服務器端不能主動向客戶端發送數據。php

不知道你們有沒看過《記憶碎片》,這部電影裏面的男主角患了罕見的短時間記憶喪失症,也就是同一我的,上次一塊兒打過招呼,下次趕上了也不認識。可是他藉助於紙跟筆,以及身上的紋身讓他去記住一些東西。這比如在咱們web開發中的cookiesession。就是由於http得了臉盲症cookiesession纔會應運而生。html

http請求與響應

http遵循請求(Request)/應答(Response)模型java

圖片描述

HTTP請求

POST /login.php HTTP/1.1        //請求行
HOST: www.jiejieyh.cn            //請求頭
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
                                //空白行,表明請求頭結束
Username=admin&password=12345    //請求正文

請求行

HTTP請求的第一行即爲請求行,請求行有三部分組成web

  1. 第一部分說明了該請求是POST請求json

  2. 第二部分說明請求的是該域名根目錄下的login.php瀏覽器

  3. 第三部分說明使用的HTTP協議版本安全

請求頭

第二行至空白行爲HTTP中的請求頭服務器

  1. HOST表明請求的主機地址cookie

  2. User-Agent 表明瀏覽器標識

請求頭由客戶端自行設定

請求正文

HTTP請求的最後一行爲請求正文,請求正文是可選的。最常出如今POST請求方法中。

HTTP響應

HTTP/1.1 200 OK
Date: Wed, 23 Nov 2016 10:18:00 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 83
Connection: keep-alive
Server: Apache
X-Powered-By: PHP/7.0.7
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Authorization, origin, X-Requested-With, Content-Type, XMLHttpRequest,request-id
Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS
//空白行表明相應頭結束
<!DOCTYPE html>
<html lang="zh-CN">
  <head>                //響應正文或者叫消息主題
    <meta charset="utf-8">
...

響應行

HTTP響應的第一行爲響應行,其中有HTTP版本,狀態碼、以及消息「OK」

響應頭

第二行至末尾空白行爲響應頭,由服務器向客戶端發送。

響應正文

響應頭以後是響應正文,服務器向客戶端發送的數據

HTTP請求方法

GET

GET方法用於獲取請求頁面的指定信息(以實體的格式)

GET /index.php?id=1 HTTP/1.1
HOST: www.jiejieyh.cn

HEAD

使用HEAD方法服務器不能在響應裏返回消息主體,其它與GET相同。此方法經常使用來測試超文本的有效性、可訪問性和最近的改變。

攻擊者編寫掃描工具時,經常使用此方法,由於只測試資源是否存在,而不用返回消息主體。速度必定是最快的

HEAD /index.php HTTP/1.1
HOST: www.jiejieyh.cn

POST

POST方法與GET方法類似,最大的區別在於GET方法沒有請求內容,而POST是有請求內容的。

POST請求最多用於向服務器發送大量的數據。GET雖然也能發送數據,可是有長度限制。

GET請求將發送的數據顯式在瀏覽器端,而POST則不會。安全性相對對對對高一點...

POST /interface/login.php HTTP/1.1
Host: www.jiejieyh.cn
Connection: keep-alive
Content-Length: 63
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://www.jiejieyh.cn
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://www.jiejieyh.cn/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8

act=kol&userName=admin&passWord=123456&vcode=9614&autoLogin=0

PUT

PUT方法用於請求服務器把請求中的實體存儲在請求資源下,若是請求資源已經在服務器中存在則覆蓋,不存在將會建立這個資源。數據爲請求正文

PUT /input.txt
HOST:www.jiejieyh.cn

12346

這段HTTP PUT請求將會在主機根目錄下建立input.txt,內容爲123456。不用想,一般狀況下經過請求寫入文件,服務器都會禁止的。

DELETE

DELETE 方法用於請求源服務器刪除指定的資源,服務器一搬會關閉此方法。

TRACE

TRACE方法用於激發一個遠程的應用層的請求消息迴路。也就是說回顯服務器收到的請求。TRACE方法容許客戶端去了解數據被請求鏈的另外一端接收的狀況,而且利用那些數據信息去測試或診斷,此方法很是少見。

CONNECT

HTTP 1.1協議規範保留了CONNECT方法,用於能動態切換到隧道的代理。

OPTIONS

OPTIONS方法是用於請求得到由URL標識的資源在請求/響應的通訊過程當中可使用的功能選項。經過這個方法,客戶端能夠在採起具體資源請求以前,決定對該資源採起何種必要措施。或者瞭解服務器的性能。

OPTIONS / HTTP/1.1
HOST:www.jiejieyh.cn

HTTP/1.1 200 OK
Allow:OPTIONS,TRACE,GET,HEAD,POST
Server:Microsoft-IIs/7.5
Public:OPTIONS,TRACE,GET,HEAD,POST
X-Powerd-By:ASP.NET
Content-Length:0

Http狀態碼

客戶端發出請求後,服務器接收處理完成後會 向客戶端發送響應信息,其中Http響應中的第一行中,最重要的一點就是Http的狀態碼

HTTP/1.1 200 ok

此時的狀態碼爲200,在Http協議中表示請求成功

Http的狀態碼由3位數字組成,第一位數字定義了響應的類別且有隻有如下5種:

  • 1xx:信息提示,表示請求已經被成功接收,繼續處理。範圍100-101

  • 2xx:成功,服務器成功的處理了請求,範圍200-206

  • 3xx:重定向,重定向狀態碼用於告訴瀏覽器客戶端,它們訪問的資源已被移動,並告訴客戶端新的資源地址位置。這時瀏覽器將從新對新資源發起請求。範圍300-305

  • 4xx:客戶端錯誤碼,有時候客戶端會發送一些服務器沒法處理的東西,好比格式錯誤的請求,請求一個不存在的url...其範圍是400-415

  • 5xx:客戶端發送的請求有效,服務器自身出錯了,5xx就是用來描述服務器內部錯誤的,範圍500-505

常見的狀態碼

  • 200:客戶端請求成功

  • 302:重定向

  • 404:請求的資源不存在

  • 401:請求未經受權

  • 500:服務器內部錯誤

  • 503:服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

Http消息

Http消息稱爲Http頭,由4部分組成 請求頭、響應頭、普通頭、實體頭。

請求頭

請求頭只出如今Http請求中,請求報頭容許客戶端向服務器傳遞請求的附加信息和客戶端自身的信息。

經常使用的Http請求頭

  1. Host:主要用於指定被請求的Internet主機和端口號 HOST:www.jiejieyh.cn:801

  2. User-Agent:請求報頭域容許客戶端將它的操做系統、瀏覽器和其它屬性告訴服務器 User-Agent:My privacy

  3. Referer:Referer包含一個URL,表明當前訪問的URL的上一個URL,也就是說用戶是從什麼地方來到本頁面。
    Referer:www.jiejieyh.cn/register.php

  4. Cookie:Cookie是很是重要的請求頭,它是一段文本,經常使用來表示請求者的身份等。

  5. Range能夠請求實體的部份內容,多線程下載必定會用到此請求頭。例如:

    • 表示頭500個字節:bytes=0~499

    • 表示第二個500字節:bytes=500~999

    • 表示最後500字節:bytes=-500

    • 表示500字節之後的範圍:bytes=500-

  6. x-forward-for:即XXF頭,它表明請求端的IP,能夠有多個,中間以逗號隔開

  7. Accept:用於指定客戶端接收那些MIME類型的信息,如Accept:text/html,代表客戶端但願接收HTML文本。

  8. Accept-Charset:用於指定客戶端接收的字符集例如:Accept-Charset:utf-8,gb2312。若是在請求消息中沒有設置這個域,默認是任何字符集均可以接收。

響應頭

  1. Server:服務器所使用的Web服務器名稱,如Server:Apache/1.3.6(Unix),攻擊者能夠經過此頭探測Web服務器名稱。建議在服務器端進行修改此頭的信息

  2. Set-Cookie:向客戶端設置Cookie,經過查看此頭能夠清楚地看到服務器向客戶端發送的Cookie信息

  3. Last-Modified:服務器經過這個頭告訴瀏覽器,資源最後修改時間

  4. Location:服務器經過這個頭告訴瀏覽器去訪問哪一個頁面,瀏覽器接收到這個響應以後,一般會馬上訪問Location頭所指向的頁面。這個頭一般配合302狀態碼使用。

  5. Refresh:服務器經過Refresh頭告訴瀏覽器定時刷新瀏覽器

實體頭

請求和響應消息均可以傳送一個實體頭。實體頭定義了關於實體正文和請求所標識的資源的元信息。元信息也就是實體內容的屬性,包括實體信息類型、長度、壓縮方法、最後一次修改時間等。

  1. Content-Type:用於向接收方指定實體的介質類型。

  2. Content-Encoding:用做媒體類型的修飾符,它的值指示了已經被應用到實體正文的附加內容編碼,於是要得到Content-Type報頭域中所引用的媒體類型,必須採用相應的解碼機制。

  3. Content-Length:用於指明實體正文的長度,以字節方式存儲的十進制數字來表示。

  4. Last-Modified:用於指示資源的最後修改日期和時間。

相關文章
相關標籤/搜索