Cookie是服務端發送到用戶瀏覽器而且保存到本地的一小塊數據,它會在瀏覽器下次向同一服務器發起請求時,被攜帶到服務器上。css
它的做用:前端
常常用來作一些用戶會話狀態管理、個性化設置等等。數據庫
前端能夠經過document.cookie來訪問cookie。跨域
cookie是跨域的,也就是在不一樣的域名中,訪問的cookie的時候,只能訪問對應的域名的cookie。瀏覽器
搞明白這個問題,首先要明白什麼CSRF?和它相關的Cookie特性是什麼?安全
CSRF,中文名叫跨站請求僞造,發生的場景就是,用戶登錄了a網站,而後跳轉到b網站,b網站直接發送一個a網站的請求,進行一些危險操做,就發生了CSRF攻擊!服務器
這時候,懂得這個CSRF了嗎?我認爲一部分同窗依然不懂,由於我看過太多這樣的描述了!cookie
由於有這麼一些疑惑,爲何在b網站能夠仿造a網站的請求?Cookie不是跨域的嗎?什麼條件下,什麼場景下,會發生這樣的事情?優化
這時候,咱們要注意上面我對cookie的定義,在發送一個http請求的時候,攜帶的cookie是這個http請求域的地址的cookie。也就是我在b網站,發送a網站的一個請求,攜帶的是a網站域名下的cookie!不少同窗的誤解,就是以爲cookie是跨域的,b網站發送任何一個請求,我只能攜帶b網站域名下的cookie。網站
固然,咱們在b網站下,讀取cookie的時候,只能讀取b網站域名下的cookie,這是cookie的跨域限制。因此要記住,不要把http請求攜帶的cookie,和當前域名的訪問權限的cookie混淆在一塊兒。
還要理解一個點:CSRF攻擊,僅僅是利用了http攜帶cookie的特性進行攻擊的,可是攻擊站點仍是沒法獲得被攻擊站點的cookie。
這個和XSS不一樣,XSS是直接經過拿到Cookie等信息進行攻擊的。
在CSRF攻擊中,就Cookie相關的特性:
一、http請求,會自動攜帶Cookie。
二、攜帶的cookie,仍是http請求所在域名的cookie。
明白了CSRF的本質,就能理解如何防護CSRF的攻擊。
方案一:放棄Cookie、使用Token!
因爲CSRF是經過Cookie僞造請求的方式,欺騙服務器,來達到本身的目的。那麼咱們採起的策略就是,不使用Cookie的方式來驗證用戶身份,咱們使用Token!
Token的策略,通常就是登錄的時候,服務端在response中,返回一個token字段,而後之後全部的通訊,前端就把這個token添加到http請求的頭部。
這是當前,最經常使用的防護CSRF攻擊的策略。
方案二:SameSite Cookies
前端在發展,Cookie也在進化,Cookie有一個新的屬性——SateSite。可以解決CSRF攻擊的問題。
它表示,只能當前域名的網站發出的http請求,攜帶這個Cookie。
固然,因爲這是新的cookie屬性,在兼容性上確定會有問題。
方案三:服務端Referer驗證
咱們發送的http請求中,header中會帶有Referer字段,這個字段表明的是當前域的域名,服務端能夠經過這個字段來判斷,是否是「真正」的用戶請求。
也就是說,若是b網站僞造a網站的請求,Referer字段仍是代表,這個請求是b網站的。也就能辨認這個請求的真僞了。
不過,目前這種方案,使用的人比較少。可能存在的問題就是,若是連Referer字段都能僞造,怎麼辦?
一樣的道理,理清楚這二者的關係,先要搞明白什麼是XSS攻擊。
XSS是因爲不安全的數據引發的,有多是表單提交的數據,有多是頁面路徑的參數問題。
CSRF是經過僞造http請求,來達到本身的攻擊目的。可是XSS是經過盜取用戶的敏感信息而達到攻擊的目的。好比本地存儲、用戶密碼、cookie等等。
好比這個不安全的數據,是一個script標籤,那這個script就能夠連接任意的js文件,瀏覽器本地就會執行這個js,那經過js咱們能作的東西就太多了:
好比document.cookie,獲取用戶信息。
好比經過localStorage,獲取本地存儲的敏感信息(token)。
而後只要是這個頁面展現的任何信息,我均可以獲取。
方案一:http-only
Cookie有一個http-only屬性,表示只能被http請求攜帶。
假如你的網站遭受到XSS攻擊,攻擊者就沒法經過document.cookie獲得你的cookie信息。
方案二:正則校驗
咱們瞭解到,XSS是因爲不安全的數據引發的,這些數據的來源,一個重要的渠道就是提交表單,注入到數據庫。因此針對前端,咱們須要把表單數據進行正則驗證,經過驗證以後,才能提交數據。
對於服務端,也應該對接受的數據,進行規則校驗,不符合規則的數據不該該入庫。從接口層面,保證數據安全。
方案三:數據轉義
若是沒法保證數據庫的數據都是安全的,前端能作的事情就是,把全部須要展現到頁面的數據,進行轉義,好比遇到script標籤,直接replace處理。或者遇到標籤標識‘<’以及‘>’這類特殊字符,添加‘\’進行處理。
一、cookie能夠引發csrf攻擊,token在保持用戶會話的時候好一點。
二、因爲http請求攜帶cookie,當cookie過大的時候,會增大http請求的帶寬。
三、cookie的特性,致使了cookie面對CSRF攻擊的時候,很不安全。
從安全方面,儘可能的使用token,進行會話保持。
從http請求的角度,儘量讓cookie的信息少一點,從而使得http請求的體積更小。
因爲cookie的一個經常使用的做用,是保持用戶會話的,因此僅僅在接口請求的時候,使用cookie。
加載其餘資源,好比圖片、js、css文件等等,能夠託管到CDN上,這樣就不會攜帶cookie,CDN的策略也使得資源加載更快。