CSRF攻擊
主要攻擊對象是Cookie中保有用戶狀態(tài)的情況,如用Cookie保存SessionID或JWT
這樣在另一個網(wǎng)站中嵌入被攻擊網(wǎng)站的url,就可以在用戶不知情的情況下代替該用戶向被攻擊網(wǎng)站發(fā)送請求。
原因
瀏覽器在發(fā)送請求時,會自動發(fā)送Cookie
防御方法
方法1: 客戶端在每次http請求時,附帶與服務(wù)端約定好的其他參數(shù),可以放在header里,因為瀏覽器不會自動做這個操作,所以就防止了CSRF攻擊。簡單來說就是服務(wù)端在校驗請求時,不單純基于Cookie,還要基于一個Cookie外的附加信息。
方法2: 【不建議使用】不在Cookie中保存用戶狀態(tài),比如將JWT保存在客戶端內(nèi)存或LocalStorage里。因為沒有使用Cookie,所以自然就不會有CSRF的問題,但這個會帶來新的問題——XSS攻擊。因為不在Cookie中的話,如果代碼被侵入會非常容易取得用戶狀態(tài)。而利用Cookie的 HttpOnly可以有效的保護Cookie。
XSS
利用在被攻擊網(wǎng)站侵入的腳本,獲得想要得到的內(nèi)容,發(fā)給黑客網(wǎng)站并保存。
如獲取當前用戶的Cookie信息,就可以冒充該用戶向服務(wù)器發(fā)送請求。
原因
被攻擊網(wǎng)站有缺口可以執(zhí)行嵌入的代碼
防御方法
首先應(yīng)該保證前端代碼的健壯性,不會執(zhí)行嵌入的代碼。
但這個不是這里想討論的重點,這里主要是想保護Cookie或者說是用戶狀態(tài),所以防御的方法是上文已經(jīng)提到的設(shè)置Cookie為HttpOnly。
這個屬性是可以對每個Cookie的屬性分別設(shè)置的,所以只要把SessionID或者JWT這種敏感的信息設(shè)置成HttpOnly就可以了。
補充說明
以上兩點,都屬于在客戶端進行攻擊,保證了以上兩點,并不代表網(wǎng)站就安全了,因為除了在客戶端攻擊以外,還可以在網(wǎng)絡(luò)上監(jiān)聽報文。抓取到了報文后,一樣可以冒充用戶發(fā)送請求。
所以,為了報文的安全,要采用Https進行通信。
這樣JWT或者SessionID就不會被截獲了。
順便說個概念:
加密方式分為信道加密和內(nèi)容加密。
Https屬于信道加密。類似密碼的加密或者JWT里面對某些內(nèi)容的加密,屬于內(nèi)容加密。