Cookie / Session 的機制與安全

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

Cookie和Session是為了在無狀態的HTTP協議之上維護會話狀態,使得服務器可以知道當前是和哪個客戶在打交道。本文來詳細討論Cookie和Session的實現機制,以及其中涉及的安全問題。

因為HTTP協議是無狀態的,即每次用戶請求到達服務器時,HTTP服務器并不知道這個用戶是誰、是否登錄過等。現在的服務器之所以知道我們是否已經登錄,是因為服務器在登錄時設置了瀏覽器的Cookie!Session則是借由Cookie而實現的更高層的服務器與瀏覽器之間的會話。

Cookie是由網景公司的前雇員Lou Montulli在1993年發明的,現今Cookie已經廣泛使用了。

cookie

Cookie 的實現機制

Cookie是由客戶端保存的小型文本文件,其內容為一系列的鍵值對。?Cookie是由HTTP服務器設置的,保存在瀏覽器中, 在用戶訪問其他頁面時,會在HTTP請求中附上該服務器之前設置的Cookie。 Cookie的實現標準定義在RFC2109: HTTP State Management Mechanism中。 那么Cookie是怎樣工作的呢?下面給出整個Cookie的傳遞流程:

  1. 瀏覽器向某個URL發起HTTP請求(可以是任何請求,比如GET一個頁面、POST一個登錄表單等)
  2. 對應的服務器收到該HTTP請求,并計算應當返回給瀏覽器的HTTP響應。

    HTTP響應包括請求頭和請求體兩部分,可以參見:讀 HTTP 協議。

  3. 在響應頭加入Set-Cookie字段,它的值是要設置的Cookie。

    在RFC2109 6.3 Implementation Limits中提到: UserAgent(瀏覽器就是一種用戶代理)至少應支持300項Cookie, 每項至少應支持到4096字節,每個域名至少支持20項Cookie。

  4. 瀏覽器收到來自服務器的HTTP響應。
  5. 瀏覽器在響應頭中發現Set-Cookie字段,就會將該字段的值保存在內存或者硬盤中。

    Set-Cookie字段的值可以是很多項Cookie,每一項都可以指定過期時間Expires。 默認的過期時間是用戶關閉瀏覽器時。

  6. 瀏覽器下次給該服務器發送HTTP請求時, 會將服務器設置的Cookie附加在HTTP請求的頭字段Cookie中。

    瀏覽器可以存儲多個域名下的Cookie,但只發送當前請求的域名曾經指定的Cookie, 這個域名也可以在Set-Cookie字段中指定)。

  7. 服務器收到這個HTTP請求,發現請求頭中有Cookie字段, 便知道之前就和這個用戶打過交道了。

  8. 過期的Cookie會被瀏覽器刪除。

總之,服務器通過Set-Cookie響應頭字段來指示瀏覽器保存Cookie, 瀏覽器通過Cookie請求頭字段來告訴服務器之前的狀態。 Cookie中包含若干個鍵值對,每個鍵值對可以設置過期時間。

Cookie 的安全隱患

Cookie提供了一種手段使得HTTP請求可以附加當前狀態, 現今的網站也是靠Cookie來標識用戶的登錄狀態的:

  1. 用戶提交用戶名和密碼的表單,這通常是一個POST HTTP請求。
  2. 服務器驗證用戶名與密碼,如果合法則返回200(OK)并設置Set-Cookieauthed=true
  3. 瀏覽器存儲該Cookie。
  4. 瀏覽器發送請求時,設置Cookie字段為authed=true
  5. 服務器收到第二次請求,從Cookie字段得知該用戶已經登錄。 按照已登錄用戶的權限來處理此次請求。

這里面的問題在哪里?

我們知道可以發送HTTP請求的不只是瀏覽器,很多HTTP客戶端軟件(包括curl、Node.js)都可以發送任意的HTTP請求,可以設置任何頭字段。 假如我們直接設置Cookie字段為authed=true并發送該HTTP請求, 服務器豈不是被欺騙了?這種攻擊非常容易,Cookie是可以被篡改的!

Cookie 防篡改機制

服務器可以為每個Cookie項生成簽名,由于用戶篡改Cookie后無法生成對應的簽名, 服務器便可以得知用戶對Cookie進行了篡改。一個簡單的校驗過程可能是這樣的:

  1. 在服務器中配置一個不為人知的字符串(我們叫它Secret),比如:x$sfz32
  2. 當服務器需要設置Cookie時(比如authed=false),不僅設置authed的值為false, 在值的后面進一步設置一個簽名,最終設置的Cookie是authed=false|6hTiBl7lVpd1P
  3. 簽名6hTiBl7lVpd1P是這樣生成的:Hash('x$sfz32'+'false')。 要設置的值與Secret相加再取哈希。
  4. 用戶收到HTTP響應并發現頭字段Set-Cookie: authed=false|6hTiBl7lVpd1P
  5. 用戶在發送HTTP請求時,篡改了authed值,設置頭字段Cookie: authed=true|???。 因為用戶不知道Secret,無法生成簽名,只能隨便填一個。
  6. 服務器收到HTTP請求,發現Cookie: authed=true|???。服務器開始進行校驗:?Hash('true'+'x$sfz32'),便會發現用戶提供的簽名不正確。

通過給Cookie添加簽名,使得服務器得以知道Cookie被篡改。然而故事并未結束。

因為Cookie是明文傳輸的, 只要服務器設置過一次authed=true|xxxx我不就知道true的簽名是xxxx了么, 以后就可以用這個簽名來欺騙服務器了。因此Cookie中最好不要放敏感數據。 一般來講Cookie中只會放一個Session Id,而Session存儲在服務器端。

Session 的實現機制

Session 是存儲在服務器端的,避免了在客戶端Cookie中存儲敏感數據。 Session 可以存儲在HTTP服務器的內存中,也可以存在內存數據庫(如redis)中, 對于重量級的應用甚至可以存儲在數據庫中。

我們以存儲在redis中的Session為例,還是考察如何驗證用戶登錄狀態的問題。

  1. 用戶提交包含用戶名和密碼的表單,發送HTTP請求。
  2. 服務器驗證用戶發來的用戶名密碼。
  3. 如果正確則把當前用戶名(通常是用戶對象)存儲到redis中,并生成它在redis中的ID。

    這個ID稱為Session ID,通過Session ID可以從Redis中取出對應的用戶對象, 敏感數據(比如authed=true)都存儲在這個用戶對象中。

  4. 設置Cookie為sessionId=xxxxxx|checksum并發送HTTP響應, 仍然為每一項Cookie都設置簽名。
  5. 用戶收到HTTP響應后,便看不到任何敏感數據了。在此后的請求中發送該Cookie給服務器。
  6. 服務器收到此后的HTTP請求后,發現Cookie中有SessionID,進行放篡改驗證。
  7. 如果通過了驗證,根據該ID從Redis中取出對應的用戶對象, 查看該對象的狀態并繼續執行業務邏輯。

Web應用框架都會實現上述過程,在Web應用中可以直接獲得當前用戶。 相當于在HTTP協議之上,通過Cookie實現了持久的會話。這個會話便稱為Session。

轉自:?https://harttle.land/2015/08/10/cookie-session.html?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448371.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448371.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448371.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

手動擋

定義 手動擋,即用手撥動變速桿才能改變變速器內的齒輪嚙合置,改變傳動比,從而達到變速的目的。作用 一方面提供了手動的樂趣 另外一方面就是通過手動自主控制轉速,還可以遲延或提前換檔。駕駛技巧 市區內應直視前方五…

Servlet快速入門及運行流程

一、Servlet快速入門 1.創建一個web工程 2.在JavaResource中src下創建一個包名稱為com.myxq.servlet 3.在創建的servlet包當中創建一個class文件起名為FirstServlet 4.進入該class實現一個Servlet接口,實現它未實現的方法 重點看service方法在該方法當中寫入一句話進…

C++之多繼承

1.基礎知識 1.1 類之間的關系 has-A,uses-A 和 is-A has-A 包含關系,用以描述一個類由多個“部件類”構成。實現has-A關系用類成員表示,即一個類中的數據成員是另一種已經定義的類。 常和構造函數初始化列表一起使用 uses-A 一個類部分地…

自動擋

定義 所謂自動擋,就是不用駕駛者去手動換檔,車輛會根據行駛的速度和交通情況自動選擇合適的檔位行駛。作用 能根據路面狀況自動變速,使駕駛者可以全神貫地注視路面交通而不會被換檔搞得手忙腳亂。工作原理 自動變速器&#xff0c…

聊一聊 cookie

我們看到的 cookie 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 我自己創建了一個網站,網址為http://ppsc.sankuai.com。在這個網頁中我設置了幾個cookie:JS…

跨域資源共享 CORS 詳解

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。 它允許瀏覽…

油門

定義 油門是內燃機上控制燃料供量的裝置。作用 是汽車發動機與摩托車油箱之間的閥門,控制汽油的量。操作注意 1.空車起步勿用大油門,以小油門為宜,負荷起步則以中油門為宜。 2.啟動時將油門放在合適位,使機件不易磨損。…

C++之泛型編程(模板)

1.模板綜述 背景 有時候許多函數或子程序的邏輯結構是一樣的,只是要處理的數據類型不一樣有時候多個類具有相同邏輯的成員函數和成員變量,只是成員變量的數據類型以及成員函數的參數類型不一樣模板就是解決數據類型不一致造成代碼冗余的一種機制&#xf…

Base64轉PDF、PDF轉IMG(使用pdfbox插件)

--添加依賴 <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.12</version></dependency&…

const的用法,特別是用在函數后面

原文出處&#xff1a;http://blog.csdn.net/zcf1002797280/article/details/7816977

圖解 Linux 安裝 JDK1.8 、配置環境變量

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 到官網下載 JDK 1.8 https://www.oracle.com/technetwork/java/javase/downloads/index.html 2. 用 rz 命令把 jdk-8u191-linux-x6…

剎車

定義 剎車就是可以減慢車速的機械制動裝置&#xff0c;又名減速器。簡單來說&#xff0c;汽車剎車踏板在方向盤下面&#xff0c;踩住剎車踏板&#xff0c;則使剎車杠桿聯動受壓并傳至到剎車鼓上的剎車片卡住剎車輪盤&#xff0c;使汽車減速或停止運行。作用 目的是減速&a…

【原創】Performanced C++ 經驗規則 第五條:再談重載、覆蓋和隱藏

第五條&#xff1a;再談重載、覆蓋和隱藏 在C中&#xff0c;無論在類作用域內還是外&#xff0c;兩個&#xff08;或多個&#xff09;同名的函數&#xff0c;可能且僅可能是以下三種關系&#xff1a;重載&#xff08;Overload&#xff09;、覆蓋&#xff08;Override&#xff0…

C++之純虛函數和抽象類

純虛函數和抽象類 1.基本概念 2.案例 #include <iostream> using namespace std;////面向抽象類編程(面向一套預先定義好的接口編程)//解耦合 ....模塊的劃分class Figure //抽象類 { public://閱讀一個統一的界面(接口),讓子類使用,讓子類必須去實現virtual void get…

解決: -bash: $‘\302\240docker‘: command not found

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我只是運行 一條很簡單的啟動容器的命令&#xff0c;多次執行都報錯&#xff0c;報錯如題&#xff1a; -bash: $\302\240docker: comma…

換擋/掛檔

定義 換擋/掛檔是指變速器&#xff0c;用于轉變發動機曲軸的轉矩及轉速&#xff0c;以適應汽車在起步、加速、行駛以及克服各種道路阻礙等不同行駛條件下對驅動車輪牽引力及車速不同要求的需要。作用 使汽車能以非常低的穩定車速行駛&#xff0c;而這種低的轉速只靠內然…

sql:無法解決 equal to 操作中 Chinese_PRC_CI_AS 和 Chinese_Taiwan_Stroke_CI_AS 之間的排序規則沖突。...

--無法解決 equal to 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_Taiwan_Stroke_CI_AS" 之間的排序規則沖突。 CREATE VIEW View_VipBranchStaffBranchList AS select VipBranchStaff.*,geovindu_branch.B_Name,VipExamCountry.ExamCountryName from VipBran…

【汽車取證篇】GA-T 1998-2022《汽車車載電子數據提取技術規范》(附下載)

【汽車取證篇】GA-T 1998-2022《汽車車載電子數據提取技術規范》&#xff08;附下載&#xff09; GA-T 1998-2022《汽車車載電子數據提取技術規范》標準—【蘇小沐】 總結 公眾號回復關鍵詞【汽車取證】自動獲取資源合集&#xff0c;如鏈接失效請留言&#xff0c;便于…

解決: Client does not support authentication protocol requested by server; consider upgrading MySQL

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 在服務器上把 mysql 裝好后&#xff0c;運行起來。 2. navicat 死活連接不上&#xff0c;在網上查說是要改數據庫賬號、密碼什么的&…

C++之STL理論基礎

1.基本概念 STL&#xff08;Standard Template Library&#xff0c;標準模板庫)是惠普實驗室開發的一系列軟件的統稱。雖然主要出現在C中&#xff0c;但在被引入C之前該技術就已經存在了很長的一段時間。 STL的從廣義上講分為三部分&#xff1a;algorithm&#xff08;算法&am…