CSRF 防禦策略

什麼是 CSRF

CSRF(「跨站請求僞造」):攻擊者經過郵件、社區發帖等方式誘導受害者進入第三方網站,而且在第三方網站中向被攻擊網站發送跨站請求;這主要是利用了受害者在被攻擊網站已經獲取的登陸憑證(cookie),且 cookie 會自動附在對特定域名的請求裏的瀏覽器特性,達到冒充用戶對被攻擊的網站執行某項操做(如指定受害者的郵箱帳戶自動將全部收到的郵件都轉發到攻擊者的郵箱裏)的目的。html

幾種常見的攻擊類型

GET 類型的 CSRF 攻擊

GET 類型的 CSRF 攻擊很是容易實現,在<img>的 url 裏構造惡意 URL 便可,用戶在任何頁面上只要加載了這個<img>,都至關於向該惡意 URL 發出了一次 GET 請求。前端

POST 類型的 CSRF 攻擊

這種類型的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 攻擊,超連接類型的 CSRF 攻擊須要誘導用戶主動點擊,因此須要必定的欺騙手段,用戶點擊超連接後會跳轉到攻擊者構建的一個惡意 URL 裏,也至關因而執行了一次 GET 請求。後端

CSRF的特色

  • CSRF(一般)發生在第三方域名,但若是被攻擊網站管控用戶內容不嚴格的話,也有可能被髮布惡意超連接等,這樣防禦起來就更困難了,由於 referer 是來自於自己。
  • 攻擊利用受害者在被攻擊網站的登陸憑證,冒充受害者提交操做;而不是直接竊取或修改受害者的隱私數據。

防禦策略

針對這兩點,咱們能夠專門制定防禦策略,以下:瀏覽器

  • 阻止不明外域的訪問cookie

    • 同源檢測
    • Samesite Cookie
  • 提交時要求附加本域才能獲取的信息session

    • CSRF Token / 雙重 cookie 驗證
    • 在 LocalStorage 裏存放登陸憑證

同源檢測

瀏覽器在發送請求的時候,會帶上originreferer這兩個 HTTP 頭部字段,通常狀況下,咱們能夠在收到請求的時候校驗這兩個字段是否來自可信的域名。分佈式

可是,雖然瀏覽器不容許修改originreferer,可是有可能因爲瀏覽器自己的機制,或者是攻擊者刻意隱藏,致使請求裏並無這兩個字段的信息,對於這種狀況,能夠考慮攔截掉。網站

Samesite Cookie

cookie 有個SameSite屬性能夠防 CSRF 攻擊,使用SameSite=Lax後,從別的網站提交 POST 表單或發送 ajax 請求時都不會附上 cookie ,這樣就從根本上解決 CSRF 攻擊。但這個SameSite屬性只在現代瀏覽器上生效, IE 上是不支持的。url

CSRF Token

除了傳統的 cookie 之外,咱們能夠添加一個額外的 token 做爲用戶憑證。

token 的生成

  • 全局共享:每次登陸的時候生成一個隨機數寫到 cookie 裏;之後每次請求接口的時候,前端就從 cookie 中取出這個隨機數做爲請求參數;後端校驗的時候只須要比對接口參數和 cookie 裏的值就能夠了,也不須要存 session 了(分佈式 session 成本較高)。這種方法被稱爲「雙重 cookie」。
  • 每一個接口/表單獨立生成:針對每一個接口/表單都生成一個獨立的 token ,「驗證碼」就屬於這種方案。在這種方案下,生成和儲存 token 的成本都比較高,建議只用于敏感接口。

雙重 cookie 驗證

所謂的雙重 cookie ,指的是在請求接口時,除了常規帶上 cookie 中的用戶憑證信息,如 session_id 外,還把 cookie 中的用戶憑證信息讀出來附在接口請求參數裏;這種方案對比起 CSRF Token 方案來講,好在不須要生成額外的 token ,也一樣可以起到防護 CSRF 攻擊的效果。

在 LocalStorage 裏存放登陸憑證

CSRF 的關鍵是:cookie 是自動附在請求裏的,那若是登陸憑證不是放在 cookie 而是 LocalStorage 裏的話,好比使用 jwt 方案,那就從根本上破解了 CSRF 攻擊了,不過這樣的話,就須要防止 XSS 攻擊了。

避免本身的網站被利用

除了須要避免本身的網站被攻擊外,咱們還須要避免本身的網站被利用來攻擊其它網站:

  • 嚴格限制用戶上傳的內容,如禁止上傳 HTML 文件
  • 不容許用戶直接引用外鏈的圖片
  • 對於用戶發佈的超連接,須要對瀏覽者提醒這是屬於外鏈的超連接
相關文章
相關標籤/搜索