CSRF攻擊防範小知識
一、背景
CSRF是一種常見的跨站偽造請求攻擊,它通過偽造真實使用者的請求,來欺騙伺服器以實現非法操作的目的。相比於xss攻擊,它無法讀取到使用者的cookie等隱私資訊,但可以在規則之內做一些使用者未感知的危險操作。
二、原理
它利用瀏覽器無法區分請求是否是使用者真實操作的特點,來自動向被攻擊服務傳送請求。
舉個例子:
1、假設使用者登入了qq郵箱- qq.email, 這時候瀏覽器儲存了使用者的登入cookie等資訊
2、這時候使用者收到了一封釣魚郵件,並且打開了郵件中的連結。
3、瀏覽器新開的頁面實際是hacker的攻擊頁面,它裡面包含以下內容:
<img src="qq.email?delete=1234" size=1/>
那麼在使用者開啟這個頁面時候,便會想qq郵箱傳送一個請求,刪除某些郵件,或者是其他非法操作。
這個時候,由於瀏覽器還儲存了郵箱的cookie,在傳送請求的時候,會自動帶上使用者的身份資訊,因此,服務端會認為這是一個正常的使用者請求,也就如實執行了刪除等操作。
當然,對於post型別的介面,hacker在頁面中可以加入如下程式碼:
<form method="POST" action="https://qq.email.com/mail/h/ewt1jmuj4ddv/?v=prf" enctype="multipart/form-data"> <input type="hidden"name="cf2_emc" value="true"/> <input type="hidden" name="cf2_email" value="[email protected]"/> ..... <input type="hidden" name="irf" value="on"/> <input type="hidden" name="nvp_bu_cftb" value="Create Filter"/> </form> <script> document.forms[0].submit(); </script>
同樣也是可以向post介面偽造請求的。
三、防範
防範的本質是區分哪些是使用者真實的請求,並忽略那些偽造的請求。
1、增加token驗證機制
在使用者每次訪問服務時,服務端根據一定的規則,比如時間+使用者特則等進行編碼,生成一個隨機的token給到前端,同時,服務端自己也將在session中儲存這個token資訊。
前端將這個token儲存在自己的上下文中,在下次傳送請求的時候,便將這個token作為引數的一部分發送到服務端,然後服務端根據規則驗證這個token是否有效,並對有效的請求進行處理。
2、雙cookie驗證機制
在使用者訪問網站頁面時,向請求域名注入一個Cookie,內容為隨機字串(例如csrfcookie=v8g9e4ksfhw)。
在前端向後端發起請求時,取出Cookie,並新增到URL的引數中(接上例POST https://www.a.com/comment?csrfcookie=v8g9e4ksfhw)。
後端介面驗證Cookie中的欄位與URL引數中的欄位是否一致,不一致則拒絕。