天天看點

《圖解HTTP》閱讀筆記

 HTTP基礎的簡單了解

在了解HTTP協定之前,我們先了解下TCP/IP的參考模型,TCP/IP參考模型分為四層:應用層、傳輸層、網絡層、鍊路層(資料鍊路層)。

應用層:為不同的網絡應用提供所需的服務。

傳輸層:為應用層實體提供端到端的通信/傳輸功能,確定資料包的按順序傳送及資料的完整性。

網絡層:處理網絡上流動的資料包,它所包含的協定涉及到資料包在整個網絡上的邏輯傳輸。

鍊路層:監控資料交換,處理網絡連接配接的硬體部分。

TCP/IP通信傳輸流如下圖所示:

《圖解HTTP》閱讀筆記

HTTP在各層的封裝處理:

《圖解HTTP》閱讀筆記

與HTTP協定密切相關的協定/服務:IP,TCP,DNS

IP協定負責資料包的傳送,當然,這需要配合IP位址和MAC位址,IP間的通信依賴MAC位址,這就涉及到用以解析位址的ARP協定了。

TCP提供了可靠的位元組流服務,對要發送的大塊資料進行分割成小資料包以易于傳輸,并且該協定可确認資料包是否送達到目的方。

DNS服務負責解析域名

URI(統一資源辨別符)和URL(統一資源定位符)

URI:一個用于辨別某一網際網路資源名稱的字元串。組成:主機名(含端口号)+相對路徑+辨別符

URL:對可以從網際網路上得到的資源的位置和通路方法的一種簡潔的表示,是網際網路上标準資源的位址。組成:協定+主機名(含端口号)+相對路徑

Cookies

HTTP協定用于用戶端和服務端之間通過請求和響應的交換所達成的通信,并且它是一種無狀态的協定,不會對請求和響應之間的通信狀态進行儲存(無法根據前一次請求對這次請求做出處理),但為了能夠有儲存狀态的功能,引入了cookies技術。

《圖解HTTP》閱讀筆記

持久連接配接

HTTP初始版本時,每進行一次HTTP請求就會斷開一次TCP連接配接,這情況在早期傳輸文本很小的時候倒也不覺得如何,但是随着時代的進步,所需傳輸的内容種類越來越多和内容越來越大了,每次連接配接後都會斷開請求就大幅度的增加了通信量的開銷了。幸好,自HTTP/1.1和部分HTTP/1.0來,有了持久連接配接這麼個神奇的東西,它規定了隻要任何一方沒有明确的提出斷開連接配接,那麼就保持TCP連接配接狀态。而在維持的TCP連接配接期間,可以多次進行HTTP請求來傳輸需要的内容。

《圖解HTTP》閱讀筆記

HTTP/1.1預設保持持久連接配接,在HTTP的頭部資訊中會有Connection: Keep-alive屬性,我們也可以通過浏覽器開發工具的NetWork面闆檢視這個屬性的狀态及HTTP請求資訊:

《圖解HTTP》閱讀筆記

得益于持久連接配接,HTTP實作了管線化,能夠做到同時并行發送多個請求,而無需一個接一個的等待響應。

HTTP請求的内容結構

HTTP協定互動的資訊稱為HTTP封包,通過下面的圖來看看HTTP封包的結構:

《圖解HTTP》閱讀筆記

除卻空行(回車符、換行符),大緻分為封包首部和封包主體。封包首部包含請求行(請求的方法、URI、HTTP版本)和狀态行(響應狀态碼、原因短語、HTTP版本),首部字段(請求和響應的條件和屬性),其他(未定義的首部)。

首部字段

首部字段規定了用戶端如何處理請求和服務端如何處理響應,根據用途可分為四種:請求首部(請求封包使用的首部),響應首部(響應封包使用的首部),通用首部(請求和響應通用的首部),實體首部(封包實體部分使用的首部)。

HTTP/1.1首部字段清單

通用首部字段

請求首部字段

響應首部字段

實體首部字段

此外,還有一些如Cookie、Set-Cookie和Content-Disposition等在其他RFC中定義的首部字段也經常會被用到。

傳輸編碼

HTTP傳輸資料的時候可以傳輸原資料,也可以在傳輸過程中編碼以提升傳輸速率。通過傳輸時的編碼處理,能有效的處理大量的通路請求。常用的内容編碼有以下幾種

· gzip(GUN zip)

· compress(UNIX系統的标準壓縮)

· deflate(zlib)

· identity(不進行編碼)

多部分對象集合

HTTP協定中采納了多部分對象集合,允許發送的封包主體内可含有多類型實體。多用于上傳檔案或者圖檔時使用,可以設定Content-Type屬性對其進行規定。如以下幾種常見的形式:

Text:用于标準化地表示的文本資訊,文本消息可以是多種字元集和或者多種格式的

Multipart:用于連接配接消息體的多個部分構成一個消息,這些部分可以是不同類型的資料

Application:用于傳輸應用程式資料或者二進制資料

範圍請求

實作這項功能需要指定下載下傳的實體範圍,如:一份1000位元組大小的檔案,想取300-3000位元組範圍内的資源,可以設定Range:bytes=300-3000;想取300-3000位元組和5000位元組到最後的資源,可以設定Range:bytes=300-3000,5000-

内容協商

内容協商機制是指用戶端和服務端就響應資源内容進行交涉,然後提供給客戶最為适合的資源,内容協商會以響應資源的語言、字元集、編碼方式等作為判斷的基準。涉及到以下首部字段:

· Accept

· Accept-Charset

· Accept-Encoding

· Accept-Language

· Content-Language

内容協商技術又分為三種類型

伺服器驅動協商:服務端以請求的首部字段作為參考,在服務端處理并且傳回對應資源。

用戶端驅動協商:使用者通過浏覽器提供的可選清單進行手動選擇,或者利用js腳本在web頁面上自行選擇。

透明協商:伺服器驅動協商和代理驅動協商的結合體,當一個緩存被提供了構成響應的一系列可得的表現形式,并且次元的差異能完全被緩存了解,那麼此緩存變得有能力代表源伺服器為那個資源的後續請求去執行伺服器驅動協商

HTTP方法及狀态碼

HTTP方法

HTTP中也包含了一些方法,用于指定請求的資源按期望産生某種行為。對于這些方法,其中用的最多的是get和post,大家也一定很熟悉了~

HTTP/1.1和HTTP/1.0支援的方法

HTTP狀态碼

HTTP狀态碼表示用戶端HTTP請求的傳回結果,通過狀态碼,使用者可以知道HTTP請求是否出現問題,問題出在哪,下面簡單羅列一些HTTP狀态碼:

一些常見的狀态碼:

HTTP代理及緩存

代理

代理指的是具有轉發功能的應用程式,接收用戶端的請求轉發給服務端,也接收服務端的響應轉發給用戶端。代理不會改變請求的URI,會直接發送給持有資源的伺服器。

在HTTP通信過程中可以級聯多台代理伺服器,并且轉發時需要附加Via首部字段以标記經過的主機資訊。

《圖解HTTP》閱讀筆記

緩存

緩存是代理伺服器或用戶端本地磁盤内儲存的資源副本,利用緩存來減少對源伺服器的通路以便于節省通信流量和通信時間,也可以達到更好的互動體驗。

請求的資源如果已經被緩存則直接由緩存伺服器傳回給用戶端,或者用戶端直接從本地磁盤讀取。緩存可以設定有效時間,當判斷緩存過期後,用戶端/緩存伺服器可像源伺服器重新請求新資源。

HTTP安全更新--HTTPS

講了一些HTTP的優點後,來看看HTTP的缺點

· 通信使用明文(未經加密),内容可能被竊聽

· 不驗證通信方的身份,請求/響應會遭僞裝

· 無法證明封包的完整性,存在被篡改的可能

網際網路的任何角落都存在通信内容被竊聽的風險

按照TCP/IP協定的工作機制,通信内容在所有的通信線路上都有可能遭受窺視。即使是加密處理過的通信,也會被窺視到通信内容,隻是經過了加密,就有可能讓人無法破解出正确完整的封包資訊含義,加密後的封包資訊本身内容還是會被看到。

一般來說,竊聽通信是通過收集在網際網路上流動的資料包來做解析,這些可以通過抓包和嗅探工具實作,這也使得一些使用公共wifi賬号被盜的事情時有發生。

針對明文傳輸這點,也可以對封包主體(傳輸内容)進行加密處理

針對身份驗證這點,可通過在本地安裝證書,存儲身份認證資訊等

針對確定資訊完整性,MD5/SHA-1的散列值校驗,數字簽名等

HTTP => HTTPS

HTTP不帶加密機制,但可以通過和SSL(安全 套接層...标注下閱讀時的停頓)或TLS(安全層傳輸協定)的組合使用,用SSL建立安全通信線路後,就可以在這條線路上歡快的進行HTTP通信了。由于結合了SSL,HTTP更新成為HTTPS(或者 HTTP over SSL),然而這還不能說是個完整的HTTPS。

完整的HTTPS = HTTP + 加密 + 認證 + 完整性保護

一次完整的HTTPS請求

《圖解HTTP》閱讀筆記

1.用戶端發送Client Hello封包開始SSL通信,封包中包含用戶端支援的SSL的指定版本、加密元件清單等

2.服務端可進行SSL通信時,會以Serve rHello封包作為應答

3.服務端發送Certificate封包,封包包含公開密鑰證書

4.服務端發送Server Hello Done封包通知用戶端,最初階段的SSL握手協商部分結束

5.SSL第一次握手結束後,用戶端以Client Key Exchange封包作為回應,其中包含通信加密中使用的随機密碼串

6.用戶端發送Change Cipher Spec封包,提示服務端此封包之後的通信采用符合上一步的随機密碼串的密鑰加密

7.用戶端發送Finished封包,其中包含連接配接至今全部封包的整體校驗值

8.服務端發送Change Cipher Spec封包

9.服務端發送Finished封包

10.Finished封包交換完畢後,SSL連接配接建立完成

11.應用層協定通信,HTTP

12.用戶端斷開連接配接,發送close notify

WebSocket 和 http/2.0

WebSocket

WebSocket實作了再Web用戶端和服務端之間的全雙工通信,一旦Web服務端與用戶端之間建立WebSocket協定的通信連接配接,之後的所有通信都依賴這個專用協定進行。

WebSocket具有推送功能,服務端可直接向用戶端推送資料,不必等待用戶端的請求;由于WebSocket一直保持連接配接狀态,并且首部資訊小,使得通信量也相應的減少。

為了實作WebSocket通信。需要用到前面說到的HTTP首部字段Upgrade,達到告知服務端通信協定發生改變,當成功握手确立WebSocket連接配接之後,通信時不再使用HTTP的資料幀,而采用WebSocket獨立的資料幀。

HTTP/2.0

核心優勢/特性

多路複用:多個請求都是通過一個 TCP 連接配接并發完成(HTTP/1.1管線化在多個請求之間的響應會被阻塞,HTTP/2.0解決了這問題,并且支援優先級和流量控制)

頭部壓縮:封包頭部壓縮處理,數通信量更小

服務端推送:服務端能夠更快的把資源推送給用戶端

語義改進:采用二進制格式傳輸資料

Web的攻擊技術

以伺服器為目标的主動攻擊,代表性的有SQL注入和OS指令注入,SQL注入是指攻擊者通過直接通路Web應用,把攻擊的SQL代碼傳入服務端以執行資料庫來擷取所需的資料資訊或篡改資料庫資訊(調用SQL語句的方式所産生的漏洞);OS指令攻擊指的是在服務端執行非法的作業系統指令達到攻擊的目的。

以伺服器為目标的被動攻擊,其模式如下:

1.攻擊者誘導使用者觸發已經設定好的陷阱,啟動發送已嵌入攻擊代碼的HTTP請求

2.含有攻擊代碼的HTTP發送到服務端并允許

3.運作完攻擊代碼後,存在安全漏洞的Web應用便會成為攻擊者的跳闆,導緻個人資訊被竊取(網絡安全課的知識全還給老師了...起初看到這些,一臉懵逼...)

以用戶端為目标的主動攻擊,代表性的跨站腳步攻擊(XSS),通過存在安全漏洞的Web網站注冊使用者的浏覽器内運作非法的HTML标簽或者JavaScript代碼進行的一種攻擊方式,該攻擊可擷取使用者個人資訊等

還有HTTP首部注入攻擊、郵件首部注入攻擊、目錄周遊攻擊、遠端檔案所包含的漏洞等

設定或設計導緻的安全漏洞

強制浏覽,從安置在Web服務端的公開目錄下的檔案中浏覽那些原本非自願公開的檔案,導緻個人資訊/内部檔案資訊的洩露

抛出錯誤資訊導緻的漏洞,暴露出系統的出錯點,給攻擊者提供了攻擊的突破點

開放重定向,對任意URL作重定向跳轉的功能,攻擊者可誘導使用者到具有惡意的Web站點

會話管理疏忽導緻的安全漏洞

會話劫持,攻擊者通過一些手段拿到使用者會話ID,并使用此會話ID僞裝成使用者達到攻擊的目的

攻擊者可能獲得會話ID的一些方式:

· 通過非正規的生成方法推測出會話ID

· 通過竊聽或XSS攻擊盜取會話ID

· 通過會話固定攻擊強行擷取會話ID

會話固定攻擊,大緻模式為:攻擊者通路站點拿到未認證的會話ID,設定陷阱強制使用者使用這個會話ID前去認證,一旦使用者觸發陷阱并完成認證,攻擊者就可使用使用者的身份順利登陸網站

跨站點請求僞造,攻擊者通過設定的陷阱強制對已完成認證的使用者進行非預期的資訊某些狀态的更新

其他安全漏洞

密碼破解,擷取密碼,突破認證(通過網絡密碼試錯或者對已加密的密碼進行破解),密碼破解如字典攻擊、彩虹表、擷取密鑰、加密算法漏洞等

點選劫持,又稱界面僞裝,大多以透明層元素作為陷阱以達到攻擊目的

Dos攻擊,讓服務端的服務呈停止狀态(利用通路請求造成資源過載,資源用盡以停止服務;通過攻擊安全漏洞停止服務)

後門程式,開發者debug的程式,開發者為自身利益植入的程式等

繼續閱讀