Cookie/Session機制與安全

首先,HTTP協(xié)議是無狀態(tài)(stateless)的穴店。Cookie和Session都是在無狀態(tài)的HTTP協(xié)議上來維護會話狀態(tài)阵谚。

因為HTTP協(xié)議是無狀態(tài)的衔憨,每次用戶請求到達服務器時,HTTP服務器不知道用戶是誰宴抚,是否登錄過勒魔,服務器之所以知道我們登錄過,是因為服務器在我們登錄時設置了瀏覽器的Cookie。Session則是借由Cookie實現(xiàn)更高層的服務器與瀏覽器間的會話酱塔。



Cookie實現(xiàn)機制

Cookie 是客戶端保存的小型文本文件沥邻,內容為一系列鍵值對。
Cookie是HTTP服務器設置的羊娃,并且保存在瀏覽器中唐全。
用戶再訪問其他頁面時,會在HTTP請求中保存之前的Cookie蕊玷。

Cookie的具體傳遞流程:

  1. 瀏覽器向URL發(fā)起HTTP請求邮利,這個請求可以是GET一個頁面,POST一個登錄表單等垃帅。
  2. 對應的服務器接受到HTTP請求延届,并計算應當返回給瀏覽器的HTTP響應,HTTP響應包括響應頭和響應體兩個部分贸诚。
  3. 響應頭中加入Set-Cookie字段方庭,他的值是要設置的Cookie厕吉。
    RFC2109 6.3 Implementation Limits 中提到: UserAgent(瀏覽器就是一種用戶代理)至少應支持300項Cookie, 每項至少應支持到4096字節(jié)械念,每個域名至少支持20項Cookie头朱。
  4. 瀏覽器接收到服務器發(fā)來的HTTP響應。
  5. 瀏覽器收到HTTP響應龄减,發(fā)現(xiàn)Set-Cookie字段项钮,并將字段的值保存在硬盤或者內存中。
    Set-Cookie字段的值可以是很多項Cookie希停,每一項都可以指定過期時間Expires烁巫。
  6. 瀏覽器下次給服務器發(fā)送HTTP請求時,會將服務器設置的Cookie附加在HTTP請求的頭字段Cookie中宠能。
    瀏覽器可以存儲多個域名下的Cookie亚隙,但是只發(fā)送當前請求的域名曾指定過的Cookie。
  7. 服務器接收到HTTP請求棍潘,發(fā)現(xiàn)請求頭中有Cookie字段恃鞋,就知道之前已和這個用戶打過招呼了。

總之亦歉,服務器通過Set-Cookie響應頭字段來指示瀏覽器保存Cookie恤浪, 瀏覽器通過Cookie請求頭字段來告訴服務器之前的狀態(tài)。 Cookie中包含若干個鍵值對肴楷,每個鍵值對可以設置過期時間水由。


Cookie的隱患

Cookie是有隱患的。
第一次服務器驗證用戶和密碼赛蔫,設置Set-Cookie為authed=true砂客,后返回 200(OK)。
于是瀏覽器再次發(fā)帶有Cookie信息的HTTP請求(設置authed=true)呵恢,服務器會得知用戶已登錄鞠值,于是按照登錄的權限去處理這次請求。
但是渗钉,假如用HTTP客戶端軟件(Node.js)來模擬瀏覽器發(fā)請求彤恶,明文設置相同的Cookie字段,并設置authed=true鳄橘,服務器會不會被騙声离?這種攻擊十分容易,因為服務器是會被篡改的瘫怜。


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響應并發(fā)現(xiàn)頭字段Set-Cookie: authed=false|6hTiBl7lVpd1P晒衩。
  5. 用戶在發(fā)送HTTP請求時嗤瞎,篡改了authed值,設置頭字段Cookie: authed=true|???听系。 因為用戶不知道Secret贝奇,無法生成簽名,只能隨便填一個靠胜。
  6. 服務器收到HTTP請求掉瞳,發(fā)現(xiàn)Cookie: authed=true|???。服務器開始進行校驗: Hash('true'+'x$sfz32')浪漠,便會發(fā)現(xiàn)用戶提供的簽名不正確陕习。

通過給Cookie添加簽名,使得服務器得以知道Cookie被篡改址愿。

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


Session實現(xiàn)機制

Session一般用來存儲重要數據,一般儲存在HTTP服務器內存中赖晶,或者內存數據庫中(redis)律适,對于重量級應用甚至可以儲存在數據庫中。

下面以儲存在redis中為例嬉探,考察如何驗證用戶登陸狀態(tài)的問題擦耀。

  1. 用戶提交賬戶和密碼的表單,發(fā)送POST請求涩堤。
  2. 服務器驗證賬戶和密碼眷蜓,若正確則把當前用戶名儲存到redis中,在redis中生成對應的id胎围。
  3. 服務器設置Cookie為SessionID并發(fā)送HTTP響應吁系,也同樣設置簽名德召。
  4. 用戶收到HTTP響應后,便看不到敏感數據了汽纤,然后發(fā)送Session Cookie字段的請求給服務器上岗。
  5. 服務器收到請求后,同樣進行Session Cookie的防篡改驗證蕴坪,若通過驗證肴掷,則根據ID從redis中取出用戶對象,查看該對象的狀態(tài)并繼續(xù)執(zhí)行業(yè)務邏輯背传。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末呆瞻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子径玖,更是在濱河造成了極大的恐慌痴脾,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梳星,死亡現(xiàn)場離奇詭異赞赖,居然都是意外死亡,警方通過查閱死者的電腦和手機冤灾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門前域,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瞳购,你說我怎么就攤上這事话侄。” “怎么了学赛?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵年堆,是天一觀的道長。 經常有香客問我盏浇,道長变丧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任绢掰,我火速辦了婚禮痒蓬,結果婚禮上,老公的妹妹穿的比我還像新娘滴劲。我一直安慰自己攻晒,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布班挖。 她就那樣靜靜地躺著鲁捏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萧芙。 梳的紋絲不亂的頭發(fā)上给梅,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天假丧,我揣著相機與錄音,去河邊找鬼动羽。 笑死包帚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的运吓。 我是一名探鬼主播渴邦,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拘哨!你這毒婦竟也來了几莽?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤宅静,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后站欺,有當地人在樹林里發(fā)現(xiàn)了一具尸體姨夹,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年矾策,在試婚紗的時候發(fā)現(xiàn)自己被綠了磷账。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡贾虽,死狀恐怖逃糟,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蓬豁,我是刑警寧澤绰咽,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站地粪,受9級特大地震影響取募,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蟆技,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一玩敏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧质礼,春花似錦旺聚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妻坝,卻和暖如春伸眶,著一層夾襖步出監(jiān)牢的瞬間惊窖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工厘贼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留界酒,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓嘴秸,卻偏偏與公主長得像毁欣,于是被迫代替她去往敵國和親债蓝。 傳聞我的和親對象是個殘疾皇子蓄坏,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348