內容從以下幾個方面展開
1.什麼是csrf
csrf 攻擊簡單來說,是多tab頁面瀏覽器的乙個安全漏洞,比如你正在訪問a**,此時如果瀏覽器有你的cookie,並且session沒有過期,此時你去訪問b**,那麼b**可以直接呼叫a**的介面,而a**則認為是你本人進行的操作。以下是圖示:
2.如何進行防禦
對csrf進行防禦,可以通過加token.也就是當你訪問a**的時候,a會給你乙個token,然後,接下去的post請求,你需要把token帶上,不然伺服器則拒絕接收這個請求。
- 1. token的產生:spring-security 4.0之後預設開啟csrf,可以直接產生csrf token。
- 2. token的儲存:這裡儲存是指服務端的儲存,token是儲存在session中。
- 3. token的傳送:token可以通過cookie,也可以放在header中自定義的屬性中。
- 4. token的接收和返回:前段收到http respon 之後,需要把相應的token返回回來。
- 5. token校驗:伺服器端對自己持有的token和客戶端反饋回來的token進行校驗,決定是否拒絕服務(拒絕服務可以自定義)。
3.rest 的csrf防禦
一般寫rest服務(也就是直接@responsebody)返回json字串,則可以把token加在header裡頭的自定義屬性中,為什麼不能直接加在header中的cooike裡,spring-sercurity官方給出的答案:
翻譯一下:
- 1.cookie可以被其他域設定
- 2.cookie是沒有狀態的,但是如果是session(含有過期時間),則可以使session過期,從而使token失效。(如有出入,歡迎拍磚)
既然如此,那麼需要在header中加入token,我們只要註冊乙個filter,就可以完成這個功能:
- step 1 建立filter
/**
* * "將csrf token加入到header中"
* * created by hzlaojiaqi on 2016/9/13.
*/public
class
csrftokenresponseheaderbindingfilter
extends
onceperrequestfilter
filterchain.dofilter(request, response);}}
實驗
情況2 帶header發起token
可以看到,伺服器端正確返回資料。
情況3 不帶header發起token
可以看到,伺服器端 拒絕了我們的請求。
spring rest風格程式設計
在spring4 中提供了 rest 風格程式設計的介面 rest url 特點 rest 風格會將引數當成 url的一部分,如在 url 中實際請求為 users 1 1 表示userid 的值。controller 在獲取時,註解url 對應引數 1部分用 來代替,users 獲取引數時引數型別...
配置csrf Django 啟用和禁用CSRF功能
csrf cross site request forgery 也就是跨站請求偽造,實現的原理是csrf攻擊者在使用者已經登入目標 之後,誘使使用者訪問乙個攻擊頁面,利用目標 對使用者的信任,以使用者身份在攻擊頁面對目標 發起偽造使用者操作的請求,達到攻擊目的 django.middleware.c...
Spring REST(擴充套件自描述訊息)
瀏覽器讀取的優先順序 第二優先順序 image webp image apng 擴充套件自描述訊息 person 請求的引數 1啥的卻無法 person.id 1 person.name 啥的卻無法 自定義擴充套件步驟 1.實現abstracthttpmessageconverter 抽象類中的方法...