CSRF(「跨站請求僞造」):攻擊者經過郵件、社區發帖等方式誘導受害者進入第三方網站,而且在第三方網站中向被攻擊網站發送跨站請求;這主要是利用了受害者在被攻擊網站已經獲取的登陸憑證(cookie),且 cookie 會自動附在對特定域名的請求裏的瀏覽器特性,達到冒充用戶對被攻擊的網站執行某項操做(如指定受害者的郵箱帳戶自動將全部收到的郵件都轉發到攻擊者的郵箱裏)的目的。html
GET 類型的 CSRF 攻擊很是容易實現,在<img>
的 url 裏構造惡意 URL 便可,用戶在任何頁面上只要加載了這個<img>
,都至關於向該惡意 URL 發出了一次 GET 請求。前端
這種類型的CSRF利用起來一般使用的是一個自動提交的表單:ajax
<form action="http://bank.example/withdraw" method=POST> <input type="hidden" name="account" value="xiaoming" /> <input type="hidden" name="amount" value="10000" /> <input type="hidden" name="for" value="hacker" /> </form> <script> document.forms[0].submit(); </script>
跟上述兩種 CSRF 攻擊,超連接類型的 CSRF 攻擊須要誘導用戶主動點擊,因此須要必定的欺騙手段,用戶點擊超連接後會跳轉到攻擊者構建的一個惡意 URL 裏,也至關因而執行了一次 GET 請求。後端
針對這兩點,咱們能夠專門制定防禦策略,以下:瀏覽器
阻止不明外域的訪問cookie
提交時要求附加本域才能獲取的信息session
瀏覽器在發送請求的時候,會帶上origin
和referer
這兩個 HTTP 頭部字段,通常狀況下,咱們能夠在收到請求的時候校驗這兩個字段是否來自可信的域名。分佈式
可是,雖然瀏覽器不容許修改origin
和referer
,可是有可能因爲瀏覽器自己的機制,或者是攻擊者刻意隱藏,致使請求裏並無這兩個字段的信息,對於這種狀況,能夠考慮攔截掉。網站
cookie 有個SameSite
屬性能夠防 CSRF 攻擊,使用SameSite=Lax
後,從別的網站提交 POST 表單或發送 ajax 請求時都不會附上 cookie ,這樣就從根本上解決 CSRF 攻擊。但這個SameSite
屬性只在現代瀏覽器上生效, IE 上是不支持的。url
除了傳統的 cookie 之外,咱們能夠添加一個額外的 token 做爲用戶憑證。
所謂的雙重 cookie ,指的是在請求接口時,除了常規帶上 cookie 中的用戶憑證信息,如 session_id 外,還把 cookie 中的用戶憑證信息讀出來附在接口請求參數裏;這種方案對比起 CSRF Token 方案來講,好在不須要生成額外的 token ,也一樣可以起到防護 CSRF 攻擊的效果。
CSRF 的關鍵是:cookie 是自動附在請求裏的,那若是登陸憑證不是放在 cookie 而是 LocalStorage 裏的話,好比使用 jwt 方案,那就從根本上破解了 CSRF 攻擊了,不過這樣的話,就須要防止 XSS 攻擊了。
除了須要避免本身的網站被攻擊外,咱們還須要避免本身的網站被利用來攻擊其它網站: