Cookie是什么
Cookie是服務端發送到用戶瀏覽器並且保存到本地的一小塊數據,它會在瀏覽器下次向同一服務器發起請求時,被攜帶到服務器上。
它的作用:
-
經常用來做一些用戶會話狀態管理、個性化設置等等。
-
前端可以通過document.cookie來訪問cookie。
-
cookie是跨域的,也就是在不同的域名中,訪問的cookie的時候,只能訪問對應的域名的cookie。
Cookie 和 CSRF 的關系是什么
搞明白這個問題,首先要明白什么CSRF?和它相關的Cookie特性是什么?
1、CSRF是什么?
CSRF,中文名叫跨站請求偽造,發生的場景就是,用戶登陸了a網站,然后跳轉到b網站,b網站直接發送一個a網站的請求,進行一些危險操作,就發生了CSRF攻擊!
這時候,懂得這個CSRF了嗎?我認為一部分同學依然不懂,因為我看過太多這樣的描述了!
因為有這么一些疑惑,為什么在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等信息進行攻擊的。
2、Cookie相關特性?
在CSRF攻擊中,就Cookie相關的特性:
1、http請求,會自動攜帶Cookie。
2、攜帶的cookie,還是http請求所在域名的cookie。
3、Cookie如何應對的 CSRF攻擊?
明白了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字段都能偽造,怎么辦?
Cookie 和 XSS 的關系是什么
同樣的道理,理清楚這兩者的關系,先要搞明白什么是XSS攻擊。
1、XSS是什么
XSS是由於不安全的數據引起的,有可能是表單提交的數據,有可能是頁面路徑的參數問題。
CSRF是通過偽造http請求,來達到自己的攻擊目的。但是XSS是通過盜取用戶的敏感信息而達到攻擊的目的。比如本地存儲、用戶密碼、cookie等等。
比如這個不安全的數據,是一個script標簽,那這個script就可以鏈接任意的js文件,瀏覽器本地就會執行這個js,那通過js我們能做的東西就太多了:
比如document.cookie,獲取用戶信息。
比如通過localStorage,獲取本地存儲的敏感信息(token)。
然后只要是這個頁面展示的任何信息,我都可以獲取。
2、Cookie 如何應對 XSS攻擊
方案一:http-only
Cookie有一個http-only屬性,表示只能被http請求攜帶。
假如你的網站遭受到XSS攻擊,攻擊者就無法通過document.cookie得到你的cookie信息。
方案二:正則校驗
我們了解到,XSS是由於不安全的數據引起的,這些數據的來源,一個重要的渠道就是提交表單,注入到數據庫。所以針對前端,我們需要把表單數據進行正則驗證,通過驗證之后,才能提交數據。
對於服務端,也應該對接受的數據,進行規則校驗,不符合規則的數據不應該入庫。從接口層面,保證數據安全。
方案三:數據轉義
如果無法保證數據庫的數據都是安全的,前端能做的事情就是,把所有需要展示到頁面的數據,進行轉義,比如遇到script標簽,直接replace處理。或者遇到標簽標識‘<’以及‘>’這類特殊字符,添加‘\’進行處理。
Cookie 和 Token 對比
1、cookie可以引起csrf攻擊,token在保持用戶會話的時候好一點。
2、由於http請求攜帶cookie,當cookie過大的時候,會增大http請求的帶寬。
3、cookie的特性,導致了cookie面對CSRF攻擊的時候,很不安全。
Cookie如何做優化
從安全方面,盡量的使用token,進行會話保持。
從http請求的角度,盡可能讓cookie的信息少一點,從而使得http請求的體積更小。
由於cookie的一個常用的作用,是保持用戶會話的,所以僅僅在接口請求的時候,使用cookie。
加載其他資源,比如圖片、js、css文件等等,可以托管到CDN上,這樣就不會攜帶cookie,CDN的策略也使得資源加載更快。