項目進行安全測試時須要預防CSRF攻擊,記錄一下學習的過程。php
一.CSRF攻擊是什麼?html
CSRF(Cross-site request forgery)跨站請求僞造,也被稱爲「One Click Attack」或者Session Riding,一般縮寫爲CSRF或者XSRF,是一種對網站的惡意利用。舉個例子,你登陸了信任網站www.aaa.com(A網站),A網站服務器裏的session存放了你的登陸狀態,並調用接口 http://api.aaa.com/getUserInfo 以獲取你的我的信息,你在未登出時,又點擊了惡意網站www.bbb.com(B網站),此時若是B網站上有相似<img src="http://api.aaa.com/getUserInfo">,<script src="http://api.aaa.com/getUserInfo></script>的代碼,當A網站沒有作CSRF預防,A網站的服務端就收到了http://api.aaa.com/getUserInfo的請求,而且由於cookie的存在,判斷你處於登陸的狀態,返回了數據,至此,B網站就竊取了你的我的信息。前端
二.如何預防?後端
CSRF攻擊是源於Web的會話身份驗證機制,雖然能夠保證一個請求是來自於某個用戶的瀏覽器,但卻沒法保證該請求是用戶批准發送的,這個狀況是有可能發生的,預防通常是服務端來作。api
1.檢測請求的referer,這種方式能夠預防至關一部分的攻擊,可是不全,由於referer能夠被僞造。瀏覽器
2.添加csrf_token,項目爲後端渲染成html時能夠生成一個csrftoken到表單中,請求時攜帶這個token,先後端分離時的具體方法以下:安全
1.用戶登陸時,服務端能夠初始化一個不可預測的,隨機csrftoken放到服務端session中,同時又放到前端cookie中;服務器
2.前端經過js抓取cookie裏面的csrftoken放到請求的head中去;cookie
3.服務端收到請求後,會驗證前端傳遞來的csrftoken與以前存在session中的csrftoken是否一致,一致則說明沒別劫持;session
4.緣由是,黑客能夠構造請求數據,而且攜帶cookie去請求,可是卻沒法獲取cookie的值,並且請求中的csrftoken是變化的,黑客就沒法經過服務端的驗證,請求就會失敗;
下面是生成和檢測csrftoken的php代碼
<?php //基於tp5.0框架的代碼 class Csrf{ public static function refreshToken(){ $token = md5(makeHash());//自定義的一個生成參數的函數 session('csrf_token',$token); cookie('csrf_token',$token); } public static function checkToken(){ $token = getallheaders()['X-CSRFToken'];//前端自定的header頭屬性爲 X-CSRFToken if(session('csrf_token')&&session('csrf_token')==$token){ }else{ throw \Exception('非法請求',100012); } } }