Web安全:你必須知道的「Cookie安全」
初識cookie
http是無狀態的請求響應。每次的請求響應之後,連接會立即斷開或延時斷開(保持一定的連接有效期)。斷開後,下一次請求再重新建立。在http連接時,通過cookie進行會話跟蹤,第一次響應時設置的Cookie在隨後的每次請求中都會發送出去。Cookie還可以包括登陸認證後的身份信息。
大多數瀏覽器限制每個域能有50個cookies左右。存儲的cookies最大值約為4kb,若超過這個值,瀏覽器就會刪除一些cookie。
刪除策略因瀏覽器而已。有興趣的朋友可以自己做深入研究。
刪除cookie的操作只需要設置過期值為過去的時間即可。cookie無法跨瀏覽器存在。
cookie的作用
同域內瀏覽器中發出的任何一個請求都會帶上cookie,無論請求什麼資源,請求時,cookie會出現在請求頭的cookie欄位中。
服務端響應頭的set-cookie欄位可以添加,修改和刪除cookie,大多數情況下,客戶端通過JS也可以添加,修改和刪除cookie。cookie經常用來存儲用戶的會話信息。比如,用戶登陸認證後的session,之後同域內發出的請求都會帶上認證後的會話信息,非常方便。所以攻擊者特別喜歡盜取cookie,這相當於盜取了在目標網站上的用戶許可權。Secure Cookie機制
Secure Cookie機制指的是設置了secure標誌的cookie。Secure Cookie僅在https層面上安全傳輸,如果是http請求,就不會帶上這個cookie。
這樣能降低重要的cookie被中間人截獲的風險。
不過,也不是說可以萬無一失。因為secure cookie對於客戶端腳本來說是可讀可寫的,可讀就意味著secure cookie能被盜取,可寫意味著能被篡改,所以還是存在一定的風險。HttpOnly屬性
Cookie的HttpOnly屬性,指瀏覽器不要在除HTTP(和 HTTPS)請求之外暴露Cookie。
一個有HttpOnly屬性的Cookie,不能通過非HTTP方式來訪問,例如通過調用JavaScript(例如,引用document.cookie),因此,不可能通過跨域腳本(一種非常普通的攻擊技術)來偷走這種Cookie。Facebook 和 Google 正在廣泛地使用HttpOnly屬性。
然而,目前的技術手段還是可以通過xss攻擊獲取httpOnly的cookie。有興趣的朋友可以延伸閱讀該篇:Stealing HttpOnly Cookie via XSS
Same-Site屬性
當用戶從http://a.com發起http://b.com的請求也會攜帶上Cookie,而從http://a.com攜帶過來的Cookie稱為第三方Cookie。
為了防止CSRF(Cross-site request forgrey)攻擊,可以使用SameSite屬性。Set-Cookie: CookieName=CookieValue; SameSite=Lax; Set-Cookie: CookieName=CookieValue; SameSite=Strict;
- strict:瀏覽器在任何跨域請求中都不會攜帶Cookie,這樣可以有效的防禦CSRF攻擊,但是對於有多個子域名的網站採用主域名存儲用戶登錄信息的場景,每個子域名都需要用戶重新登錄,造成用戶體驗非常的差。
- lax:相比較strict,它允許從三方網站跳轉過來的時候使用Cookie。
更多延伸閱讀:Using the Same-Site Cookie Attribute to Prevent CSRF Attacks
本地cookie與內存cookie
本地cookie與內存cookie,區別在於cookie設置的expires欄位。
如果沒有設置過期時間,就是內存cookie。隨著瀏覽器的關閉而從內存中消失。
如果設置了過期時間是未來的某一個時間點,那這個cookie就會以文本的形式保存在操作系統本地,待過期時間到了才會消失。很多網站為了提升用戶的體驗,省去每次用戶登陸的麻煩,採用本地cookie的方式,讓用戶可以在未來的一個月,或者半年,永久等時間段內不需要進行登陸操作。
這也意味著,用戶被攻擊的風險變大了。攻擊者通過xss得到這樣的本地cookie後,能夠在未來很長一段時間內,甚至是永久控制這目標用戶的賬號許可權。
然而,即使採用內存cookie也存在一定的風險,攻擊者可以給內存cookie加一個過期時間,使其變成本地cookie,這樣還是無法避免以上的安全問題。說到底,用戶賬號是否安全與伺服器端校驗有關,包括重要cookie的唯一性(是否可預測),完整性(是否被篡改),過期等校驗。
web性能與cookie
cookie在服務端和瀏覽器的通信中,主要依靠HTTP的響應頭和請求頭傳輸的,所以cookie會佔據一定的帶寬。
前面提到瀏覽器會為每一次HTPP請求自動攜帶上Cookie信息,但是對於同站內的靜態資源,伺服器並不需要處理其攜帶的Cookie,這無形中便浪費了帶寬。在最佳實踐中,一般都會將靜態資源部署到獨立的域名上,從而可以避免無效Cookie的影響。
LocalStorage
LocalStorage也是瀏覽器本地存儲數據的一個地方,是HTML5的特性。目前已經十分普及了。然而,localStorage並不會像cookie那樣可以設置數據存活的時間限制。
只要用戶不主動刪除,localstorage存儲的數據就會永久存在。
因此不建議將敏感信息存儲在localstorage中,尤其用於身份驗證的數據。localStorage沒有對xss攻擊做任何防禦機制,一旦出現xss漏洞,存儲在localstorage的數據及其容易被獲取到。
作者:陌未央
鏈接:http://www.imooc.com/article/286531
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作
推薦閱讀: