天天看點

《圖解HTTP》讀書筆記

第1章 了解 web 及網絡基礎

1.1 使用 http 協定通路 web

1.2 http 的誕生

1.3 網絡基礎 tcp/ip

1.3.1 tcp/ip 協定族

1.3.2 tcp/ip 的分層管理

1.3.3 tcp/ip 通信傳輸流

1.4 與http關系密切的協定:ip、tcp和dns

1.4.1 負責傳輸的 ip 協定

1.4.2 確定可靠性的tcp協定

1.5 負責域名解析的 dns 服務

1.6 各種協定與 http 協定的關系

1.7 uri 和 url

1.7.1 統一資源辨別符

1.7.2 uri 格式

第2章 簡單的http協定

2.1 http 協定用于用戶端和伺服器端之間的通信

2.2 通過請求和響應的交換達成通信

2.3 http是不儲存狀态的協定

2.4 請求 uri 定位資源

2.5 告知伺服器意圖的http方法

2.6 使用方法下達指令

2.7 持久連接配接節省通信量

2.7.1 持久連接配接

2.7.2 管線化

2.8 使用cookie的狀态管理

第3章 http封包内的http資訊

3.1 http 封包

3.2 請求封包及響應封包的結構

3.3 編碼提升傳輸速率

3.3.1 封包主體和實體主體的差異

3.3.2 壓縮傳輸的内容編碼

3.3.3 分隔發送的分塊傳輸編碼

3.4 發送多種資料的多部分對象集合

3.5 擷取部分内容的範圍請求

3.6 内容協商傳回最合适的内容

第4章 傳回結果的http狀态碼

4.1 狀态碼告知從伺服器端傳回的請求結果

4.2 2xx 成功

4.3 3xx 重定向

4.4 4xx 用戶端錯誤

4.5 5xx 伺服器錯誤

第五章 與http協作的web伺服器

5.1 用單台虛拟主機實作多個域名

5.2 通信資料轉發程式:代理、網關、隧道

5.2.1 代理

5.2.2 網關

5.2.3 隧道

5.3 儲存資源的緩存

5.3.1 緩存的有效期限

5.3.2 用戶端的緩存

第6章 http首部

第7章 確定web安全的https

7.1 http的缺點

7.2 http+加密+認證+完整性保護 = https

第8章 确認通路使用者身份的認證

8.1 何為認證

8.2 basic 認證

8.3 digest 認證

8.4 ssl 用戶端認證

8.5 基于表單認證

8.5.1 認證多半為基于表單認證

8.5.2 session 管理及 cookie 應用

第9章 基于http的功能追加協定

9.1 基于 http 的協定

9.2 消除 http 瓶頸的 spdy

9.2.1 http的瓶頸

9.2.2 spdy 的設計與功能

9.2.3 spdy 消除 web 瓶頸了嗎

9.3 使用浏覽器進行全雙工通信的 websocket

9.4 期盼已久的 http/2.0

第10章 建構 web 内容的技術

第11章 web攻擊技術

11.1 針對 web 的攻擊技術

11.1.1 http 不具備必要的安全功能

11.1.2 在用戶端即可篡改請求

11.1.3 針對 web 應用的攻擊模式

11.2 因輸出值轉義不完全引發的安全漏洞

11.2.1 跨站腳本攻擊

11.2.2 sql 注入攻擊

11.2.3 os 指令注入攻擊

11.2.4 http 首部注入攻擊

11.2.5 郵件首部注入攻擊

11.2.6 目錄周遊攻擊

11.2.7 遠端檔案包含漏洞

11.3 因設定或設計上的缺陷引發的安全漏洞

11.3.1 強制浏覽

11.3.2 不正确的錯誤消息處理

11.3.3 開放重定向

11.4 因會話管理疏忽引發的安全漏洞

11.4.1 會話劫持

11.4.2 會話固定攻擊

11.5 其它安全漏洞

11.5.1 密碼破解

11.5.2 點選劫持

11.5.3 dos 攻擊

11.5.4 後門程式

q&a:

http(hypertext transfer protocol,超文轉移協定,超文本傳輸協定的譯法并不嚴謹。)

tcp/ip 是網際網路相關的各類協定族的總稱。從電纜的規格到ip位址的標明方法、尋找異地使用者的方法、雙方建立通信的順序,以及web頁面顯示需要處理的步驟,等等。

tcp/ip 協定族按層次分别分為以下 4 層:應用層、傳輸層、網絡層和資料鍊路層。

分層的優點:把各層之間的接口部分規劃好之後,每個層次内部的設計就能夠自由改動了。而且,階層化之後,設計也變得相對簡單。處于應用層上的應用可以隻考慮分派給自己的任務,而無需弄清對方在地球上哪個地方、對方的傳輸路線、是否能確定傳輸送達等問題。

應用層:決定了向使用者提供應用服務時通信的活動。

tcp/ip 協定族預存了各類通用的應用服務。如 ftp(file transfer protocol)、dns(domain name system)和 http。

傳輸層:該層對上層應用層,提供處于網絡連接配接中的兩台計算機之間的資料傳輸。tcp(transmission control protocol)和 udp(user data protocol,使用者資料報協定)。

網絡層:網絡層用來處理在網絡上流動的資料包。資料包是網絡傳輸的最小資料機關。該層規定了通過怎麼樣的路徑到達對方計算機,并把資料包傳送給對方。

鍊路層:用來處理網絡的硬體部分。

《圖解HTTP》讀書筆記

利用 tcp/ip 協定族進行網絡通信時,會通過分層順序與對方進行通信。發送端從應用層往下走,接收端則往應用層往上走。

用http 舉例來說:首先作為發送端的用戶端在應用層(http協定)發出一個http請求。

接着,在傳輸層(tcp協定)把從應用層處收到的資料(http請求封包)進行分隔,并在各個封包上打上标記序号及端口号後轉發給網絡層。

在網絡層(ip協定),增加作為通信目的地的mac位址後轉發給鍊路層。這就讓發往網絡的通信請求準備齊全了。

接收端的伺服器在鍊路層接收到資料後,按序往上層發送,一直到應用層。當傳輸到應用層,才能算真正接收到用戶端發送過來的http請求。

《圖解HTTP》讀書筆記

發送端在層與層之間傳輸資料時,每經過一層時必定會被打上一個該層所屬的首部資訊。反之,接收端在層與層傳輸資料時,每經過一層時會把對應的首部消去。

把資料資訊包裝起來的做法稱為封裝。

ip(網際協定)位于網絡層。該協定的作用是把各種資料包傳送給對方。而要保證确實傳送到對方那裡,則需要滿足各類條件。其中最重要的兩個條件是 ip 位址和 mac位址。

ip 位址指明了節點被配置設定到的位址,mac位址是指網卡所屬的固定位址。ip位址可以和mac位址進行配對。

使用arp協定憑借mac位址進行通信

ip間通信通信依賴mac位址。通信的雙方通常會經過多台計算機和網絡裝置中轉才能連接配接到對方,而在進行中轉時,會利用下一站中轉裝置的mac位址來搜尋下一個中轉目标。這時,會采用arp協定。該協定是一種用以解析位址的協定,根據通信方的ip位址就可以反查出對應的mac位址。

《圖解HTTP》讀書筆記

tcp屬于傳輸層,提供可靠的位元組流服務。

位元組流服務是指:為了友善傳輸,将大塊資料分割成以封包段為機關的資料包進行管理。

這就是為什麼下載下傳高清大圖時,圖檔會一塊一塊地加載。

三次握手

為了準确無誤地将資料送達目标處,tcp協定在發送資料的準備階段采用了三次握手政策(若在握手過程中某個階段中斷,tcp協定會再次以相同的順序發送相同的資料包)。

《圖解HTTP》讀書筆記

當然,除了三次握手,tcp還有其它各種手段確定通信的可靠性。

dns服務提供域名到 ip 位址之間的解析服務。

《圖解HTTP》讀書筆記
《圖解HTTP》讀書筆記

uri(uniform resource identifier)

uniform:規定統一的格式可友善處理多種不同類型的資源。

resource:可辨別的任何東西

identifier:辨別符

uri就是某個協定方案表示的資源的定位辨別符。協定方案是指通路資源所使用的協定類型名稱,如http、ftp。

uri 用字元串辨別某一個網際網路資源,而url表示資源的地點。url是uri的子集。

表示指定的uri,要使用涵蓋全部必要資訊的絕對uri、絕對url以及相對url。相對url是指從浏覽器中基本uri處指定的url,如 <code>/image/logo.gif</code>。

絕對uri的格式如下:

《圖解HTTP》讀書筆記

應用 http 協定時,必定是一端擔任用戶端角色,另一端擔任伺服器端角色

http協定規定,先從用戶端開始建立通信,服務端在沒有接收到請求之前不會發送響應。

請求封包由請求方法、請求uri、協定版本、可選的請求首部字段和内容實體構成的。

《圖解HTTP》讀書筆記

響應封包基本上由協定版本、狀态碼、用以解釋狀态碼的原因短語、可選的響應首部字段以及實體主體構成。

《圖解HTTP》讀書筆記

http是無狀态協定。自身不對請求和響應之間通信狀态進行儲存(即不做持久化處理)。

http之是以設計得如此簡單,是為了更快地處理大量事物,確定協定的可伸縮性。

http/1.1 随時無狀态協定,但可通過 cookie 技術儲存狀态。

get:擷取資源

post:傳輸實體主體

put:傳輸檔案

head:獲得封包首部,與get方法一樣,隻是不傳回封包主體内容。用于确認uri的有效性及資源更新的日期時間等。

delete:删除檔案,與put相反(響應傳回204 no content)。

options:詢問支援的方法,查詢針對請求uri指定的資源支援的方法(allow:get、post、head、options)。

trace:追蹤路徑

connect:要求用隧道協定連接配接代理(主要使用ssl(secure sockets layer,安全套接層)和tls(transport layer security,傳輸層安全)協定把通信内容加密後經網絡隧道傳輸)。

《圖解HTTP》讀書筆記

http協定的初始版本中,每進行一次http通信就要斷開一次tcp連接配接。

發送請求一份包含多張圖檔的html文檔對應的web頁面,會産生大量通信開銷。

《圖解HTTP》讀書筆記

為了解決上述tcp連接配接的問題,http/1.1和一部分的http/1.0想出了持久連接配接(http persistent connections,也稱為http keep-alive 或 http connection resue)的方法。

持久連接配接的特點是,隻要任意一端沒有明确提出斷開連接配接,則保持tcp連接配接狀态。

《圖解HTTP》讀書筆記

持久連接配接的好處在于減少了tcp連接配接的重複建立和斷開所造成的額外開銷,減輕了伺服器端的負載。另外,減少開銷的那部分時間,使http請求和響應能夠更早地結束,這樣web頁面的顯示速度也相應提高了。

在http/1.1中,所有連接配接預設都是持久連接配接,但在http/1.0内并未标準化。

毫無疑問,除了伺服器端,用戶端也需要支援持久連接配接。

持久連接配接使得多數請求以管線化方式發送成為可能。以前發送請求後需等待并收到響應,才能發送下一個請求。管線化技術出現後,不用等待響應亦可直接發送下一個請求(并行發送多個請求)。

《圖解HTTP》讀書筆記
每個浏覽器支援的請求并發數不同,但可在頁面中使用多個域名加大并發量(因為浏覽器是基于domain的并發控制,而不是page),不過過多的散布會導緻dns解析上付出額外的代價。

http 是無狀态協定,它不對之前發生過的請求和響應的狀态進行管理。也就是說,無法根據之前的狀态進行本次的請求處理。

cookie技術通過在請求和響應封包中寫入cookie資訊來控制用戶端的狀态。

cookie會根據從伺服器端發送的響應封包内的一個叫做 <code>set-cookie</code> 的首部字段資訊,通知用戶端儲存 cookie。當下次用戶端再往該伺服器發送請求時,用戶端會自動在請求封包中加入cookie值後發送出去。

沒有 cookie 資訊狀态下的請求

《圖解HTTP》讀書筆記

第 2 次以後(存有 cookie 資訊狀态)的請求

《圖解HTTP》讀書筆記

請求封包(沒有 cookie 資訊的狀态)

響應封包(伺服器端生成 cookie 資訊)

請求封包(自動發送儲存着的 cookie 資訊)

用于http協定互動的資訊被稱為http封包。請求端的http封包叫做請求封包,響應端的叫做響應封包。http封包本身是由多行(用cr+lf做換行符)資料構成的字元串文本。

http封包大緻可分為封包首部和封包主體兩部塊。兩者由最初出現的空行(cr+lf、回車符+換行符)來劃分。通常,并不一定要有封包主體。

《圖解HTTP》讀書筆記
《圖解HTTP》讀書筆記

http在傳輸資料時可以按照資料原貌直接傳輸,但也可以在傳輸過程中通過編碼提升傳輸速率,但這會消耗更多的cpu等資源。

封包:是http通信中的基本機關,由8位組位元組流組成,通過http通信傳輸。

實體:作為請求或響應的有效載荷資料(補充項)被傳輸,其内容由實體首部和實體主體組成。

http封包的主體用于傳輸請求或響應的實體主體。

通常,封包主體等于實體主體。隻有當傳輸中進行編碼操作時,實體主體的内容發生變化,才導緻它和封包主體産生差異。

内容編碼指明應用在實體内容上的編碼格式,并保持實體資訊原樣壓縮。内容編碼後的實體由用戶端接收并負責解碼。

《圖解HTTP》讀書筆記

常見的内容編碼有:gzip(gnu zip)、compress(unix系統的标準壓縮)、deflate(zlib)、identity(不進行編碼)

在http通信過程中,請求的編碼實體資源尚未全部傳輸完成之前,浏覽器無法顯示請求頁面。在傳輸大容量資料時,通過把資料分割成多塊,能夠讓浏覽器逐漸顯示頁面。

這種把實體主體分塊的功能稱為分塊傳輸編碼(chunked transfer coding)。

《圖解HTTP》讀書筆記

分塊傳輸編碼會将實體主體分成多個部分(塊)。每一塊都會用十六進制來标記塊的大小,而實體主體的最後一塊會使用“0(cr+lf)”來标記。

使用分塊傳輸編碼的實體主體會由接收的用戶端負責解碼,恢複到編碼前的實體主體。

http協定中采納了多部分對象集合,發送的一份封包主體内可含有多類型實體。通常實在圖檔或文本檔案等上傳時使用。

《圖解HTTP》讀書筆記

下載下傳大尺寸的圖檔的過程中,如果網絡中斷,則需要重新下載下傳。是以需要一種可恢複的機制。

實作該功能需要指定下載下傳的實體範圍,像這樣,指定範圍發送的請求叫做範圍請求。

《圖解HTTP》讀書筆記

執行範圍請求時,會用到首部字段range來指定資源的byte範圍。響應會傳回狀态碼206 partial content。

如果伺服器端無法響應範圍請求,則會傳回狀态碼200 ok和完整的實體内容。

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

狀态碼的職責是當用戶端向伺服器端發送請求時,描述傳回的請求結果。

狀态碼如200 ok,以3為數字和原因短語組成。

數字中的第一位定義了響應類别,後兩位無分類。響應類别有以下五種:

類别

原因短語

1xx

informational(資訊性狀态碼)

接收的請求正在處理

2xx

success(成功狀态碼)

請求正常處理完畢

3xx

redirection(重定向狀态碼)

需要進行附加操作以完成請求

4xx

client error(用戶端錯誤狀态碼)

伺服器無法處理請求

5xx

server error(伺服器錯誤狀态碼)

伺服器處理請求出錯

200 ok:請求被正常處理

《圖解HTTP》讀書筆記

204 no content:一般在隻需從用戶端往伺服器發送資訊,而對用戶端不需要發送新資訊内容的情況下使用。

《圖解HTTP》讀書筆記

206 partial content:用戶端進行範圍請求

《圖解HTTP》讀書筆記

301 moved permanently:永久重定向。表示請求的資源已被配置設定了新的uri,以後應使用資源現在所指的uri。

也就是說,如果已經把資源對應的uri儲存為書簽了,這時應該按location首部字段提示的uri重新儲存。

《圖解HTTP》讀書筆記

302 found:臨時性重定向。表示請求的資源已被配置設定了新的uri,希望使用者(本次)能使用新的uri通路。

和301 moved permanently狀态碼相似,但302狀态碼代表的資源不是被永久移動,隻是臨時性質的。換句話說,已移動的資源對應的uri将來還有可能發生改變。比如,使用者把uri儲存成書簽,但不會像301狀态碼出現時那樣去更新書簽,而是仍舊保留傳回302狀态碼的頁面對應的uri。

《圖解HTTP》讀書筆記

303 see other:表示由于請求對應的資源存在着另一個uri,應使用get方法定向擷取請求的資源。這與302類似,但303明确表示用戶端應當采用get方法擷取資源。

《圖解HTTP》讀書筆記

304 not modified:該狀态碼表示用戶端發送附帶條件的請求(指采用get方法的請求封包中包含if-match,if-modified-since,if-none-march,if-range,if-unmodified-since中任一首部。)時,伺服器端允許請求通路資源,但因發生請求為滿足條件的情況後,直接傳回304(伺服器端資源未改變,可直接使用用戶端未過期的緩存)。304狀态碼傳回時,不包含任何響應的主體部分。

304雖被劃分在3xx類别,但是和重定向沒有關系。

《圖解HTTP》讀書筆記

307 temporary redirect:臨時重定向。與302有相同含義。307遵守浏覽器标準,不會從post變成get。

就算是304,也需要送出請求與接收響應,也會耗費資源和時間。

4xx的響應結果表明用戶端是發生錯誤的原因所在。

400 bad request:表示請求封包中存在文法錯誤。

《圖解HTTP》讀書筆記

401 unauthorized:表示發送的請求需要有通過http認證(basic認證、digest認證)的認證資訊。

《圖解HTTP》讀書筆記

403 forbidden:表明對請求資源的通路被伺服器拒絕了。伺服器端可在實體的主體部分對原因進行描述(可選)

《圖解HTTP》讀書筆記

404 not found:表明伺服器上無法找到請求的資源。除此之外,也可以在伺服器端拒絕請求且不想說明理由時時用。

《圖解HTTP》讀書筆記

5xx的響應結果表明伺服器本身發生錯誤。

500 interval server error:表明伺服器端在執行請求時發生了錯誤。也有可能是web應用存在的bug或某些臨時的故障。

《圖解HTTP》讀書筆記

503 service unavailable:表明伺服器暫時處于超負載或正在進行停機維護,現在無法處理請求。如果事先得知解除以上狀況需要的時間,最好寫入retry-after首部字段再傳回給用戶端。

《圖解HTTP》讀書筆記

http/1.1 規範允許一台http伺服器搭建多個web站點。這是利用虛拟主機(virtual host,又稱虛拟伺服器)的功能。

在網際網路上,域名通過dns服務映射到ip位址之後通路目标網站。可見,當請求發送到伺服器時,已經是以ip位址形式通路了。是以,當一台托管了兩個域名的伺服器接收到請求時就需要弄清楚究竟要通路哪個域名。

在相同的ip位址下,由于虛拟主機可以寄存多個不同主機名和域名的web網站,是以在發送http請求時,必須在host首部内完整指定主機名或域名的uri。

http通信時,除用戶端和伺服器以外,還有一些用于通信資料轉發的應用程式,例如代理、網關、隧道。它們可以配合伺服器工作。

代理:是一種有轉發功能的應用程式,扮演了位于伺服器和用戶端“中間人”的角色,接收由用戶端發送的請求并轉發給伺服器,同時也接收伺服器傳回的響應并轉發給用戶端。

網關:是轉發其他伺服器通信資料的伺服器,接收從用戶端發送來的請求時,它就像自己擁有資源的源伺服器一樣對請求進行處理。

隧道:是在相隔甚遠的用戶端和伺服器兩者之間進行中轉,并保持雙方通信連接配接的應用程式。

代理不改變請求uri,會直接發送給前方持有資源的目标伺服器。

持有資源實體的伺服器被稱為源伺服器。

《圖解HTTP》讀書筆記

例如:

《圖解HTTP》讀書筆記

每次通過代理伺服器轉發請求或響應式,會追加寫入via首部資訊。

使用代理伺服器的理由有:利用緩存技術減少網絡帶寬的流量,組織内部針對特定網站的通路控制,以擷取通路日志為主要目的,等等。

代理有多種使用方法,按兩種基準分類。一種是是否是否使用緩存,另一種是是否會修改封包。

代理緩存:代理轉發響應時,緩存代理(caching proxy)會預先将資源的副本(緩存)儲存在代理伺服器上。當代理再次接收到對相同資源的請求時,就可以不從源伺服器那裡擷取資源,而是将之前緩存的資源作為響應傳回。

透明代理:轉發請求或響應時,不對封包做任何加工的代理類型被稱為透明代理(transparent proxy)。反之,對封包内容進行加工的代理被稱為非透明代理。

網關的工作機制和代理十分相似。而網關能使通信線路上的伺服器提供非http協定服務。

利用網關能提高通信的安全性,因為可以在用戶端與網關之間的通信線路上加密以確定連接配接的安全。比如,網關可以連接配接資料庫,使用sql語句查詢資料。另外,在web購物網站上進行信用卡結算時,網關可以和信用卡結算系統關聯。

《圖解HTTP》讀書筆記

隧道可按要求建立起一條與其他伺服器的通信線路,屆時使用ssl等加密手段進行通信。隧道的目的是確定用戶端與伺服器進行安全的通信。

隧道本身不會去解析http請求。請求保持原樣中轉給之後的伺服器。隧道會在通信雙方斷開連接配接時結束。

緩存是指代理伺服器或用戶端本地磁盤内儲存的資源副本。利用緩存可減少對源伺服器的通路,節省通信流量和時間。

緩存伺服器是代理伺服器的一種。當代理轉發從伺服器傳回的響應時,代理伺服器将會儲存一份資源的副本。

緩存伺服器的優勢在于利用緩存可避免多次從源伺服器轉發資源。是以用戶端可就近從緩存伺服器上擷取資源,而源伺服器也不必多次處理相同的請求了。

《圖解HTTP》讀書筆記

對于緩存伺服器和用戶端浏覽器,當判定緩存過期或用戶端要求,會向源伺服器确認資源的有效性。若失效,浏覽器會再次請求新資源。

緩存不僅可以存在于緩存伺服器内,還可以存在用戶端浏覽器中。以internet explorer 程式為例,把用戶端緩存稱為臨時網絡檔案(temporary internet file)。

浏覽器緩存失效,會再次請求新資源。

path:用來指定cookie被發送到伺服器的哪一個目錄路徑下(即被伺服器哪個路徑接收cookie),其中"/"指的是站點根目錄,可在同一台伺服器(即使有多個應用)内共享該cookie。

通信使用明文可能會被竊聽

不驗證通信方的身份就可能遭受僞裝

無法驗證封包完整性,可能已遭篡改

核對的資訊通常是指以下這些:

密碼:隻有本人才會知道的字元串資訊

動态令牌:僅限本人持有的裝置内顯示的一次性密碼

數字證書:僅限本人(終端)持有的資訊

生物認證:指紋和虹膜等本人的生理資訊

ic卡等:僅限本人持有的資訊

http/1.1 使用的認證方式如下所示:

basic認證(基本認證)

digest 認證(摘要認證)

ssl 用戶端認證

formbase認證(基于表單認證)

《圖解HTTP》讀書筆記
《圖解HTTP》讀書筆記

因為發送給對方的隻是響應摘要及由質詢碼産生的計算結果,是以比起 basic 認證,密碼洩露的可能性就降低了。

步驟 1: 接收到需要認證資源的請求,伺服器會發送 certificate request 封包,要求用戶端提供用戶端證書。

步驟 2: 使用者選擇将發送的用戶端證書後,用戶端會把用戶端證書資訊以 client certificate 封包方式發送給伺服器。

步驟 3: 伺服器驗證用戶端證書驗證通過後方可領驗證書内用戶端的公開密鑰,然後開始 https 加密通信。

基于表單的認證方法并不是在 http 協定中定義的。用戶端會向伺服器上的 web 應用程式發送登入資訊(credential),按登入資訊的驗證結果認證。

《圖解HTTP》讀書筆記

由于使用上的便利性及安全性問題,http 協定标準提供的 basic 認證和 digest 認證幾乎不怎麼使用。另外,ssl 用戶端認證雖然具有高度的安全等級,但因為導入及維持費用等問題,還尚未普及。認證多半為基于表單認證。

鑒于 http 是無狀态協定,之前已認證成功的使用者狀态無法通過協定層面儲存下來。即,無法實作狀态管理,是以即使當該使用者下一次繼續通路,也無法區分他與其他的使用者。于是我們會使用 cookie 來

管理 session,以彌補 http 協定中不存在的狀态管理功能。

《圖解HTTP》讀書筆記

為減輕跨站腳本攻擊(xss)造成的損失,建議事先在 cookie 内加上 httponly 屬性。

使用http協定探知伺服器上是否有内容更新,就必須頻繁地從用戶端到伺服器端進行确認。如果伺服器上沒有内容更新,那麼就會産生徒勞的通信。

若想在現有web實作所需的功能,一下這些http标準就會成為瓶頸:

一條連接配接上隻可發送一個請求

請求隻能從用戶端開始。用戶端不可以接收除響應以外的指令

請求/響應首部未經壓縮就發送。首部資訊越多延遲越大

發送冗長的首部。每次互相發送相同的首部造成的浪費較多

可任意選擇資料壓縮格式。非強制壓縮發送

《圖解HTTP》讀書筆記

圖:以前的 http 通信

ajax 的解決方法

從已加載完畢的 web 頁面上發起請求,隻更新局部頁面。

而利用 ajax 實時地從伺服器擷取内容,有可能會導緻大量請求産生。另外,ajax 仍未解決 http 協定本身存在的問題。

《圖解HTTP》讀書筆記

comet 的解決方法

通常,伺服器接收到請求,在處理完畢後就立即傳回響應,但為了實作推送功能,comet會先将響應置于挂起狀态,當伺服器端有内容更新時,再傳回該響應。

内容上雖然可以做到實時更新,但為了保留響應,一次連接配接的持續時間也變長了。期間,為了維持連接配接會消耗更多的資源。另外,comet仍未解決http協定的本身存在的問題。

《圖解HTTP》讀書筆記

spdy 的目标

陸續出現的 ajax 和 comet 等提高易用性的技術,一定程度上使 http 得到了改善,但 http 協定本身的限制也令人有些束手無策。為了進行根本性的改善,需要有一些協定層面上的改動。

spdy沒有完全改寫http協定,而是在tcp/ip的應用層與運輸層之間通過新加會話層的形式運作。同時,考慮到安全性問題,spdy規定通信中使用ssl。

spdy以會話層的形式加入,控制對資料的流動,但還是采用http建立通信連接配接。是以,可照常使用http的get和post等方法、cookie以及http封包等。

《圖解HTTP》讀書筆記

使用 spdy後,http協定額外獲得以下功能。

多路複用流:通過單一的tcp連接配接,可以無限制處理多個http請求。所有請求的處理都在一條tcp連接配接上完成,是以tcp的處理效率得到提高。

賦予請求優先級:spdy不僅可以無限制地并發處理請求,還可以給請求逐個配置設定優先級順序。這樣主要是為了在發送多個請求時,解決因帶寬低而導緻響應變慢的問題。

壓縮http首部:壓縮http請求和響應的首部。

推送功能:支援伺服器主動向用戶端推送資料的功能。

伺服器提示功能:伺服器可以主動提示用戶端請求所需的資源。由于在用戶端發現資源之前就可以獲知資源的存在,是以在資源已緩存等情況下,可以避免發送不必要的請求。

因為 spdy 基本上隻是将單個域名( ip 位址)的通信多路複用,是以當一個 web 網站上使用多個域名下的資源,改善效果就會受到限制。

利用ajax和comet技術進行通信可以提升web的浏覽速度。但問題在于通信若使用http協定,就無法徹底解決瓶頸問題。

websocket技術主要是為了解決ajax和comet裡xmlhttprequst附帶的缺陷所引起的問題。

一旦web伺服器與用戶端之間建立起websocket協定的通信連接配接,之後所有的通信都依靠這個專用協定進行。通信過程中可互相發送json、xml、html或圖檔等任意格式的資料。

websocket的主要特點:

推送功能:支援由伺服器向用戶端推送資料。

減少通信量:和http相比,不但每次連接配接時的總開銷減少,而且由于websocket的首部資訊很小,通信量也相應較少。

為了實作websocket通信,在http連接配接建立之後,需要完成一次“握手”的步驟。

握手·請求:為了實作websocket通信,需要用到http的upgrade首部字段,告知伺服器通信協定發生改變,以達到握手的目的。

握手·響應:對于之前的請求,傳回狀态碼101 switching protocols 的響應。

成功握手确立websocket連接配接後,通信時不再使用http的資料幀,而采用websocket獨立的資料幀。

《圖解HTTP》讀書筆記

由于是建立在http基礎上的協定,是以連接配接的發起方仍是用戶端,而一旦确立websocket通信連接配接,不論伺服器端還是用戶端,任意一方都可直接向對方發送封包。

[http2中英對照版][17]

[http/2.0 相比1.0有哪些重大改進?][18]

簡單的http協定本身并不存在安全性問題,是以協定本身幾乎不會成為攻擊的對象。應用http協定的伺服器和用戶端,以及運作在伺服器上的web應用等資源才是攻擊目标。

就拿遠端登入時會用到的ssh協定來說,ssh具備協定級别的認證及會話管理等功能,http協定則沒有。另外在架設ssh服務方面,任何人都可以輕易地建立安全等級高的服務。而http即使已假設好伺服器,但開發者需要自行設計并開發認證及會話管理功能來滿足web應用的安全。而自行設計就意味着會出現各種形形色色的實作,可仍在運作的web應用背後就會隐藏着各種容易被攻擊者濫用的安全漏洞的bug。

對 web 應用的攻擊模式有以下兩種。

主動攻擊

被動攻擊

以伺服器為目标的主動攻擊

主動攻擊(active attack)是指攻擊者通過直接通路 web 應用,把攻擊代碼傳入的攻擊模式。由于該模式是直接針對伺服器上的資源進行攻擊,是以攻擊者需要能夠通路到那些資源。

主動攻擊模式裡具有代表性的攻擊是 sql 注入攻擊和 os 指令注入攻擊。

《圖解HTTP》讀書筆記

以伺服器為目标的被動攻擊

被動攻擊(passive attack)是指利用圈套政策執行攻擊代碼的攻擊模式。在被動攻擊過程中,攻擊者不直接對目标 web 應用通路發起攻擊。

《圖解HTTP》讀書筆記

利用被動攻擊,可發起對原本從網際網路上無法直接通路的企業内網等網絡的攻擊。隻要使用者踏入攻擊者預先設好的陷阱,在使用者能夠通路到的網絡範圍内,即使是企業内網也同樣會受到攻擊。

《圖解HTTP》讀書筆記

跨站腳本攻擊(cross-site scripting, xss)是指在使用者浏覽器内運作了非法的 html 标簽或 javascript 腳本。如果不過濾使用者輸入的資料直接顯示使用者輸入的html内容的話,就會有可能運作惡意的 javascript 腳本,導緻頁面結構錯亂,cookies 資訊被竊取等問題。

跨站腳本攻擊案例(1):在動态生成 html 處發生

《圖解HTTP》讀書筆記
《圖解HTTP》讀書筆記

此時的确認界面上,浏覽器會把使用者輸入的 &lt;s&gt; 解析成 html 标簽,然後顯示删除線。

跨站腳本攻擊案例(2):xss 是攻擊者利用預先設定的陷阱觸發的被動攻擊

跨站腳本攻擊屬于被動攻擊模式,攻擊者會事先布置好用于攻擊的陷阱。

下圖網站通過位址欄中 uri 的查詢字段指定 id,即相當于在表單内自動填寫字元串的功能。而就在這個地方,隐藏着可執行跨站腳本攻擊的漏洞。

《圖解HTTP》讀書筆記

浏覽器打開該 uri 後,直覺感覺沒有發生任何變化,但設定好的腳本卻偷偷開始運作了。當使用者在表單内輸入 id 和密碼之後,就會直接發送到攻擊者的網站(也就是 hackr.jp),導緻個人登入資訊被竊取。

《圖解HTTP》讀書筆記

跨站腳本攻擊案例(3):對使用者 cookie 的竊取攻擊

惡意構造的腳本同樣能夠以跨站腳本攻擊的方式,竊取到使用者的 cookie 資訊。

該腳本内指定的 http://hackr.jp/xss.js 檔案。即下面這段采用javascript 編寫的代碼。

《圖解HTTP》讀書筆記

sql注入攻擊(sql injection)是指針對 web 應用使用的資料庫,通過運作非法的sql而産生的攻擊。

sql 注入攻擊案例

正常處理的操作示例

《圖解HTTP》讀書筆記

該 sql 語句表示“從 booktbl 表中,顯示滿足 author= 上野宣 and flag=1(可售)所在行的資料”。

sql 注入攻擊的操作示例

把剛才指定查詢字段的上野宣改寫成“上野宣’–”。

《圖解HTTP》讀書筆記

sql 語句中的 – 之後全視為注釋。即,and flag=1 這個條件被自動忽略了。

os指令攻擊(os command injection)是指通過 web 應用,執行非法的作業系統指令達到攻擊的目的。 隻要在能調用 shell 函數的地方就有存在被攻擊的風險。

os 注入攻擊案例

《圖解HTTP》讀書筆記

下面摘選處理該表單内容的一部分核心代碼。

程式中的 open 函數會調用 sendmail 指令發送郵件,而指定的郵件發送位址即 $adr 的值。

攻擊者将下面的值指定作為郵件位址。

程式接收該值,構成以下的指令組合。

結果,含有linux 賬戶資訊 /etc/passwd 的檔案,就以郵件形式發送給了[email protected]

http首部注入攻擊(http header injection)是指攻擊者通過在響應首部字段内插入換行,添加任意響應首部或主體的一種攻擊。屬于被動攻擊模式。

http 首部注入攻擊案例

《圖解HTTP》讀書筆記

攻擊者以下面的内容替代之前的類别 id 後發送請求。

其中,%0d%0a 代表 http 封包中的換行符,緊接着的是可強制将攻擊者網站(http://hackr.jp/)的會話 id 設定成sid=123456789 的 set-cookie 首部字段。

發送該請求之後,假設結果傳回以下響應。

此刻,首部字段 set-cookie 已生效,是以攻擊者可指定修改任意的 cookie 資訊。通過和會話固定攻擊(攻擊者可使用指定的會話 id)攻擊組合,攻擊者可僞裝成使用者。

攻擊者輸入的 %0d%0a,原本應該屬于首部字段 location 的查詢值部分,但經過解析後,%0d%0a 變成了換行符,結果插入了新的首部字段。

這樣一來,攻擊者可在響應中插入任意的首部字段。

http 響應截斷攻擊

http 響應截斷攻擊:是用在 http 首部注入的一種攻擊。攻擊順序相同,但是要将兩個 %0d%0a%0d%0a 并排插入字元串後 發送。利用兩個連續的換行就可作出 http 首部與主體分隔所需的空行了,這樣 就能顯示僞造的主體,達到攻擊的目的。

郵件首部注入攻擊(mail header injection)是指 web 應用中的郵件發送功能,攻擊者通過向郵件首部 to 或 subject 内任意添加非法内容發起的攻擊。利用存在安全漏洞的web網站,可對任意郵件位址發送廣告郵件或病毒郵件。

《圖解HTTP》讀書筆記

攻擊者将以下資料作為郵件位址發起請求。

%0d%0a 在郵件封包中代表換行符。一旦咨詢表單所在的 web應用接收了這個換行符,就可能實作對 bcc 郵件位址的追加發送。

另外,使用兩個連續的換行符就有可能篡改郵件文本内容并發送。

目錄周遊攻擊(directory traversal)是指對本無意公開的檔案目錄,通過非法截斷其目錄路徑後,達成通路目的的一種攻擊。比如,通過 …/ 等相對路徑定位到 /etc/passwd 等絕對路徑上。

該功能通過以下查詢字段,指定某個檔案名。然後從 /www/log/ 檔案目錄下讀取這個指定的檔案。

攻擊者設定如下查詢字段後送出請求。

《圖解HTTP》讀書筆記

遠端檔案包含漏洞(remote file inclusion)是指當部分腳本内容需要從其他檔案讀入時,攻擊者利用指定外部伺服器的url充當依賴檔案,讓腳本讀取之後,就可運作任意腳本的一種攻擊。

《圖解HTTP》讀書筆記

強制浏覽(forced browsing)是指,從安置在web伺服器的公開目錄下的檔案中,浏覽那些原本非自願公開的檔案。比如,沒有對那些需要保護的靜态資源增權重限控制。

強制浏覽導緻安全漏洞的案例

下面我們以會員制度的 sns 日記功能為例,講解強制浏覽可能導緻的安全漏洞。該日記功能保證了除具有通路權限的使用者本人以外,其他人都不能通路日記。

《圖解HTTP》讀書筆記

該日記中包含的圖像照片的源代碼如下所示。

即使沒有對這篇日記的通路權限,隻要知道這圖檔的 url,通過直接指定 url 的方式就能顯示該圖檔。日記的功能和文本具有通路對象的控制,但不具備對圖檔通路對象的控制,進而産生了安全漏洞。

不正确的錯誤消息處理(error handling vulerability):指web應用的錯誤資訊内包含對攻擊者有用 的資訊。

不正确的錯誤消息處理導緻安全漏洞的案例

《圖解HTTP》讀書筆記
《圖解HTTP》讀書筆記

開放重定向(open redirect):是一種對指定的任意url作重定向跳轉的功能。而于此功能相關聯的安全漏洞是指, 假如指定的重定向 url 到某個具有惡意的 web 網站,那麼使用者就會被誘導至那個 web 網站。

開放重定向的攻擊案例

該功能就是向 url 指定參數後,使本來的 url 發生重定向跳轉。

攻擊者把重定向指定的參數改寫成已設好陷阱的 web 網站對應的連接配接,如下所示。

使用者看到 url 後原以為通路 example.com,不料實際上被誘導至hackr.jp 這個指定的重定向目标。

會話劫持(session hijiack)是指攻擊者通過某種手段拿到了使用者的會話 id,并非法使用此會話 id 僞裝成使用者,達到攻擊的目的。

《圖解HTTP》讀書筆記

會話固定攻擊(session fixation):對以竊取目标會話id為主動攻擊手段的會話劫持而言,會強制使用者使用攻擊者指定的會話 id,屬于被動攻擊。

《圖解HTTP》讀書筆記

跨站點請求僞造(cross-site request forgeries, csrf):是指攻擊者通過設定好陷阱,強制對已完成認證的使用者進行非預期的個人資訊或設定等某些狀态更新,屬于被動攻擊。

《圖解HTTP》讀書筆記

密碼破解:①通過網絡進行密碼試錯(窮舉法和字典攻擊);②對已加密密碼的破解(通過窮舉法·字典攻擊進行類推、彩虹表、拿到加密時使用的密鑰、加密算法的漏洞)

窮舉法

時間成本太高

字典攻擊

提前建構一個 “明文 ⇨ 密文” 對應關系的一個大型資料庫,破解時通過密文直接反查明文。但存儲一個這樣的資料庫,空間成本是驚人的。

彩虹表

彩虹表的前身

既然存儲所有的明文密碼對需要的空間太大,密碼學家們想出了一種以計算時間降低存儲空間的辦法,被稱為 “預計算的哈希鍊集”。

假設這是一條 k = 2 的哈希鍊:

《圖解HTTP》讀書筆記

其中 h 函數 就是要破解的哈希函數。

約簡函數(reduction function)r 函數 是建構這條鍊的時候定義的一個函數:它的值域和定義域與 h 函數相反。通過該函數可以将哈希值約簡為一個與原文相同格式的值。

存儲的時候,不需要存儲所有的節點,隻需要存儲每條鍊的頭尾節點(這裡是 aaa 和ccc)。以大量的随機明文作為起節點,通過上述步驟計算出哈希鍊并将終節點進行儲存,可得到一張哈希鍊集。

預計算的哈希鍊集的使用

假設密文剛好是 4d5e6f ,首先對其進行一次 r 運算,得到 ccc,然後發現剛好命中了哈希鍊集中的(aaa, ccc)鍊條。可以确定其極大機率在這個鍊條中。于是從 aaa 開始重複哈希鍊的計算過程,發現 bbb 的哈希結果剛好是 4d5e6f,于是破解成功。

如過密文重複了 k(=2)次之後,仍然沒有在末節點中找到對應的值,則破解失敗。

預計算的哈希鍊集的意義

對于一個長度為 k 的預計算的哈希鍊集,每次破解計算次數不超過 k,是以比暴力破解大大節約時間。同時每條鍊隻儲存起節點和末節點,儲存空間隻需約 1 / k,因而大大節約了空間。

r 函數存在的問題

要發揮預計算的哈希鍊集的作用,需要一個分布均勻的 r 函數。當出現碰撞時,就會出現下面這種情況

《圖解HTTP》讀書筆記

彩虹表的出現,針對性的解決了 r 函數導緻的鍊重複問題:它在各步的運算中,并不使用統一的 r 函數,而是分别使用 r1…rk 一共 k 個不同的 r 函數。

《圖解HTTP》讀書筆記

這樣一來,即使發生碰撞,通常會是下面的情況:

《圖解HTTP》讀書筆記

即使在極端情況下,兩個鍊條在同一序列位置上發生碰撞,導緻後續鍊條完全一緻,這樣的鍊條也會因為末節點相同而檢測出來,可以丢棄其中一條而不浪費存儲空間。

彩虹表的使用

首先,假設要破解的密文位于某一鍊條的 k - 1 位置處,對其進行 rk 運算,看是否能夠在末節點中找到對應的值。如果找到,則可以如前所述,使用起節點驗證其正确性。

否則,繼續假設密文位于 k - 2 位置處,這時就需要進行 rk - 1、h、rk 兩步運算,然後在末節點中查找結果。

如此反複,在最不利條件下需要将密文進行完整的 r1、h、…rk 運算後,才能得知密文是否存在于彩虹表之中。

彩虹表中時間、空間的平衡

哈希鍊集的最大計算次數為 k,平均計算次數為 k / 2;彩虹表的最大計算次數為 1 + 2 + …k = k(k - 1) / 2,平均計算次數為 [(k + 2) * (k + 1)] / 6。

可見,要解相同個數的明文,彩虹表的代價會高于哈希鍊集。

無論哈希鍊集還是彩虹表,當 k 越大時,破解時間就越長,但彩虹表所占用的空間就越小;相反,當 k 越小時,彩虹表本身就越大,相應的破解時間就越短。

為什麼加鹽哈希可以抵禦彩虹表

彩虹表在生成的過程中,針對的是特定的 h 函數,h 函數如果發生了改變,則已有的彩虹表資料就完全無法使用。

如果每個使用者都用一個不同的鹽值,那麼每個使用者的 h 函數都不同,則必須要為每個使用者都生成一個不同的彩虹表。大大提高了破解難度。

點選劫持是指利用透明的按鈕或連結做成陷阱,覆寫在web頁面之上。然後誘使使用者在不知情的情況下, 單擊那個連結通路内容的一種攻擊手段。這種行為又稱為界面僞裝(ui redressing)。

點選劫持的攻擊案例

下面以 sns 網站的登出功能為例,講解點選劫持攻擊。利用該登出功能,注冊登入的 sns 使用者隻需點選登出按鈕,就可以從sns 網站上登出自己的會員身份。

《圖解HTTP》讀書筆記

由于 sns 網站作為透明層被覆寫,sns 網站上處于登入狀态的使用者通路這個釣魚網站并點選頁面上的 play 按鈕之後,等同于點選了 sns 網站的登出按鈕。

dos攻擊(denial of service attack)是一種讓運作中的服務呈停止狀态的攻擊。有時也叫做服務停止攻擊或拒絕服務攻擊。多台計算機發起的 dos 攻擊稱為 ddos 攻擊(distributed denial of service attach)。

主要有以下兩種 dos 攻擊方式。

集中利用通路請求造成資源過載,資源用盡的同時,實際上服務也就呈停止狀态。

通過攻擊安全漏洞使服務停止。

《圖解HTTP》讀書筆記

後門程式是指開發設定的隐藏入口(如開發階段作為debug調用的後門程式),可不按正常步驟使用受限功能。利用後門程式就能夠使用原本受限的功能。

uri與url的差別

答:uri 用字元串(包括位址)辨別某一個網際網路資源,而url表示資源的地點。是以url是uri的子集。

輸入url後,浏覽器發生哪些變化

下圖需要補充:在從dns伺服器擷取ip後,進行3次握手。

《圖解HTTP》讀書筆記

get與post的差別

301與302差別

答:301是永久性重定向,搜尋引擎在抓取新内容的同時也将舊的網址替換為重定向之後的網址。

302是臨時性重定向,搜尋引擎會抓取新的内容而保留舊的網址。因為伺服器傳回302代碼,搜尋引擎認為新的網址隻是暫時的。

為什麼連接配接建立需要三次握手,而不是兩次握手?

防止失效的連接配接請求封包段被服務端接收,進而産生錯誤。(主要原因)

同步雙方的初始序列号

避免資源浪費

為什麼有時候下載下傳高清大圖時,圖檔會一塊一塊地加載。

答:這就是因為設定了http請求的長度,這樣就可以分塊的加載資源檔案。

  在請求封包中使用range屬性,在響應封包中使用content-type屬性都可以指定一定位元組範圍的http請求。

參考:

《圖解http》讀書筆記

連結: https://github.com/jchehe/blog/blob/master/posts/%e3%80%8a%e5%9b%be%e8%a7%a3http%e3%80%8b%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0.md

《圖解http》

繼續閱讀