以前項目中遇到了SameSite
的使用, SameSite
主要解決CSRF (Cross Site Request Forgery)
問題,順便也回顧下CSRF
吧。html
利用被攻擊網站服務器對用戶網頁瀏覽器的信任。前端
當用戶瀏覽惡意網頁時,攻擊者經過一些技術手段欺騙用戶的瀏覽器去訪問一個用戶曾經認證過的網站並運行一些操做(如發郵件,發消息,甚至財產操做如轉帳和購買商品)。由於請求也是攜帶認證cookie信息的,服務端沒有合適的防護措施的話就很難識別請求是用戶正常請求仍是CSRF
請求。git
結合原理和CSRF
命名能夠看出CSRF
的特色:github
攻擊者不要獲取用戶的信息(cookie等),直接欺騙用戶的瀏覽器,讓其以用戶的名義運行操。web
直接引入前端安全系列之二:如何防止CSRF攻擊?的DEMO:segmentfault
受害者登陸a.com,並保留了登陸憑證(Cookie)。
攻擊者引誘受害者訪問了b.com。
b.com 向 a.com 發送了一個請求:a.com/act=xx。瀏覽器會默認攜帶a.com的Cookie。
a.com接收到請求後,對請求進行驗證,並確認是受害者的憑證,誤覺得是受害者本身發送的請求。
a.com以受害者的名義執行了act=xx。
攻擊完成,攻擊者在受害者不知情的狀況下,冒充受害者,讓a.com執行了本身定義的操做。
針對CSRF
的攻擊原理,制定防護策略:後端
攻擊來自第三方站點:瀏覽器
Referer
字段[[科普]跨站請求僞造-CSRF防禦方法](https://www.freebuf.com/artic...緩存
CSRF
攻擊中,Referer
是沒法僞造的,可是維護比較困難;Referer
配置不許確的話,很容易阻斷正常請求;Referer
;總之不推薦使用安全
token
並驗證[[科普]跨站請求僞造-CSRF防禦方法](https://www.freebuf.com/artic...
利用token
標記合法請求。
CSRF token
的生成,下發,上送,校驗由服務端生成隨機惟一的字符串(GUID, UUID等),並保存到服務端的session
或者其餘服務端緩存(如Redis);
token
的緩存最好有過時時間;token
的安全性能夠對生成的token
進行對稱加密
。下發是服務端如何把生成的CSRF token
傳給客戶端,方式不少了,看客戶端怎麼方便提取並傳給後端。
Set-Cookie
下發;上送:是客戶端調用接口時提取CSRF token
並傳給服務。看請求接口類型也後不少上送方式。
GET
請求能夠放入queryString裏;Form POST
請求能夠添加隱藏域;AJAX
, fetch
請求還能夠採用放入request header裏;token
;CSFR
重要的場景都須要而且建議採用token
方案,一些常見的case有: