2017.W11 - Cookie vs Session - 資安
By Anthony
at 2017-03-14T23:47
at 2017-03-14T23:47
Table of Contents
2017.W11 - Cookie vs Session
> 就算今天是抱抱星期二 我還是要稱今天是 Pi-Day
## 前言 ##
雖然是老梗 但是還是替大家複習一下 Cookie 跟 Session 的差別
不然下次搞混真的會讓人無言
## 內容 ##
在提到 Cookie 與 Session 之前 需要先了解一下 HTTP 的架構
HTTP[0] 是一種廣泛使用的網路協定 (如果你透過網頁瀏覽 PTT 那就是在使用 HTTP)
目前最廣泛使用的是用 RFC 2616[1] 的 HTTP/1.1
已經完成的 RFC 7540 (HTTP/2) 則有機會成為新的標準
在 HTTP 的世界當中 請求本身是無狀態的 (stateless)
這表示任意兩個請求之間 本身是沒有關聯 (儲存狀態)
但現在的網路使用中 (排除匿名瀏覽) 網站都可以記錄你上次的
1. 瀏覽紀錄
2. 搜尋結果
3. 登入帳號
4. ...
這就跟 HTTP 的無狀態特性相違背 (?) 而 Cookie 就是處理這個需求的產物
Cookie 是定義在 RFC 2109 的一個實作
本身儲存一個特殊的字串 (有大小限制) 在瀏覽網頁的時候一併送給網頁伺服器
而伺服器會根據當初設計的邏輯做特定的處理 像是
ptt.cc 就會利用 over18 來記錄是否點擊過已滿 18 歲的紀錄
在引入 Cookie 的概念後 HTTP 就有了狀態的特性
但是明眼人一看就會發現問題:這個 Cookie 似乎隨便帶入都可以
假如有一個神奇的程式設計師 (我稱之為 JW) 他設計了一個邏輯
1. 如果請求中沒有 age 則跳出輸入年齡的視窗
2. 如果請求中有 age 這個 Cookie 則顯示 age 的內容
Cookie 本身因為是使用者可控的內容 所以伺服器永遠無法保證這個內容的合法性
這裡的合法性包含了正確性與內容不被修改
所以如果把帳號/密碼資訊 放到 Cookie 當中就是一個 十分好的巧思
另一方面 Session[2] 則是一個 (相對) 用來保證安全的 Cookie
在實務上 Session 跟 Cookie 一樣都放在請求當中
內容當然也可以被使用者控制、修改、竊取
然而 Session 本身在伺服器當中還會做額外的驗證
這裡的驗證可以包涵:來源 IP (REMOTE_ADDRESS)、User Agent [3] 等
而 session 本身並不太帶有任何的敏感資訊 (像是帳號內容 如果沒有額外的巧思...)
相反的 Session 一個跟伺服器端的資料的對應關係
可以想像成:
伺服器已經知道帳號 S 登入了 並且對應到一個 Session ID 是 5538
當只有 IP 位址從 1.2.3.4 的請求 才會做 1-1 的對應
其他的則當作是無效 Session
## 同場加映 ##
有興趣的人 也可以複習一下 Encoding、HASH、Encryption 之間的差異
在工作的時候 真的會有神奇的工程師混用這三者...
[0]: https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
[1]: https://tools.ietf.org/html/rfc2616
[2]: https://en.wikipedia.org/wiki/Session_(computer_science)
[3]: https://en.wikipedia.org/wiki/User_agent
--
> 就算今天是抱抱星期二 我還是要稱今天是 Pi-Day
## 前言 ##
雖然是老梗 但是還是替大家複習一下 Cookie 跟 Session 的差別
不然下次搞混真的會讓人無言
## 內容 ##
在提到 Cookie 與 Session 之前 需要先了解一下 HTTP 的架構
HTTP[0] 是一種廣泛使用的網路協定 (如果你透過網頁瀏覽 PTT 那就是在使用 HTTP)
目前最廣泛使用的是用 RFC 2616[1] 的 HTTP/1.1
已經完成的 RFC 7540 (HTTP/2) 則有機會成為新的標準
在 HTTP 的世界當中 請求本身是無狀態的 (stateless)
這表示任意兩個請求之間 本身是沒有關聯 (儲存狀態)
但現在的網路使用中 (排除匿名瀏覽) 網站都可以記錄你上次的
1. 瀏覽紀錄
2. 搜尋結果
3. 登入帳號
4. ...
這就跟 HTTP 的無狀態特性相違背 (?) 而 Cookie 就是處理這個需求的產物
Cookie 是定義在 RFC 2109 的一個實作
本身儲存一個特殊的字串 (有大小限制) 在瀏覽網頁的時候一併送給網頁伺服器
而伺服器會根據當初設計的邏輯做特定的處理 像是
ptt.cc 就會利用 over18 來記錄是否點擊過已滿 18 歲的紀錄
在引入 Cookie 的概念後 HTTP 就有了狀態的特性
但是明眼人一看就會發現問題:這個 Cookie 似乎隨便帶入都可以
假如有一個神奇的程式設計師 (我稱之為 JW) 他設計了一個邏輯
1. 如果請求中沒有 age 則跳出輸入年齡的視窗
2. 如果請求中有 age 這個 Cookie 則顯示 age 的內容
Cookie 本身因為是使用者可控的內容 所以伺服器永遠無法保證這個內容的合法性
這裡的合法性包含了正確性與內容不被修改
所以如果把帳號/密碼資訊 放到 Cookie 當中就是一個 十分好的巧思
另一方面 Session[2] 則是一個 (相對) 用來保證安全的 Cookie
在實務上 Session 跟 Cookie 一樣都放在請求當中
內容當然也可以被使用者控制、修改、竊取
然而 Session 本身在伺服器當中還會做額外的驗證
這裡的驗證可以包涵:來源 IP (REMOTE_ADDRESS)、User Agent [3] 等
而 session 本身並不太帶有任何的敏感資訊 (像是帳號內容 如果沒有額外的巧思...)
相反的 Session 一個跟伺服器端的資料的對應關係
可以想像成:
伺服器已經知道帳號 S 登入了 並且對應到一個 Session ID 是 5538
當只有 IP 位址從 1.2.3.4 的請求 才會做 1-1 的對應
其他的則當作是無效 Session
## 同場加映 ##
有興趣的人 也可以複習一下 Encoding、HASH、Encryption 之間的差異
在工作的時候 真的會有神奇的工程師混用這三者...
[0]: https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
[1]: https://tools.ietf.org/html/rfc2616
[2]: https://en.wikipedia.org/wiki/Session_(computer_science)
[3]: https://en.wikipedia.org/wiki/User_agent
--
Tags:
資安
All Comments
By Sarah
at 2017-03-16T07:00
at 2017-03-16T07:00
By Lily
at 2017-03-17T23:27
at 2017-03-17T23:27
By Zanna
at 2017-03-20T19:40
at 2017-03-20T19:40
By George
at 2017-03-22T10:06
at 2017-03-22T10:06
By Jacob
at 2017-03-25T21:53
at 2017-03-25T21:53
Related Posts
Apache Struts
By Connor
at 2017-03-11T16:37
at 2017-03-11T16:37
2017.W10 - Rootkit
By Leila
at 2017-03-07T22:35
at 2017-03-07T22:35
中木馬後WORD檔被上傳的過程
By David
at 2017-03-05T21:26
at 2017-03-05T21:26
3/3 22:00 公視主題之夜《手機不設防》
By Audriana
at 2017-03-03T20:29
at 2017-03-03T20:29
2017.W09 - CSRF 的攻與受
By Delia
at 2017-02-28T17:30
at 2017-02-28T17:30