成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前后端分離架構下CSRF防御機制

安全 黑客攻防
如果來不及了解CSRF的原理,可以這么理解:有一個人發給你一個搞(mei)笑(nv)圖片鏈接,你打開這個鏈接之后,便立刻收到了短信:你的銀行里的錢已經轉移到這個人的帳戶了。

[[171798]]

背景

1、什么是CSRF攻擊?

這里不再介紹CSRF,已經了解CSRF原理的同學可以直接跳到:“3、前后端分離下有何不同?”。

不太了解的同學可以看這兩篇對CSRF介紹比較詳細的參考文章:

如果來不及了解CSRF的原理,可以這么理解:有一個人發給你一個搞(mei)笑(nv)圖片鏈接,你打開這個鏈接之后,便立刻收到了短信:你的銀行里的錢已經轉移到這個人的帳戶了。

2、有哪些防御方案?

上面這個例子當然有點危言聳聽,當然可以確定的是確實會有這樣的漏洞:你打開了一個未知域名的鏈接,然后你就自動發了條廣告帖子、你的Gmail的郵件內容就泄露了、你的百度登錄狀態就沒了……

防御方案在上面的兩篇文章里也有提到,總結下,無外乎三種:

  • 用戶操作限制,比如驗證碼;
  • 請求來源限制,比如限制HTTP Referer才能完成操作;
  • token驗證機制,比如請求數據字段中添加一個token,響應請求時校驗其有效性;

第一種方案明顯嚴重影響了用戶體驗,而且還有額外的開發成本;第二種方案成本最低,但是并不能保證100%安全,而且很有可能會埋坑;第三種方案,可取!

token驗證的CSRF防御機制是公認最合適的方案,也是本文討論的重點。

3、前后端分離下有何不同?

《CSRF 攻擊的應對之道》這篇文章里有提到:

要把所有請求都改為 XMLHttpRequest 請求,這樣幾乎是要重寫整個網站,這代價無疑是不能接受的

我們前端架構早已經告別了服務端語言(PHP/JAVA等)綁定路由、攜帶數據渲染模板引擎的方式(畢竟是2011年的文章了,我們笑而不語)。

當然, 前端不要高興的太早:前后端分離之后,Nodejs不具備完善的服務端SESSION、數據庫等功能。

總結一下,在“更先進”的前端架構下,與以往的架構會有一些區別:

  • Nodejs層不處理SESSION,無法直接實現會話狀態數據保存;
  • 所有的數據通過Ajax異步獲取,可以靈活實現token方案;

實現思路

如上文提到,這里僅僅討論在“更先進”的前端后端架構背景下的token防御方案的實現。

1、可行性方案

token防御的整體思路是:

  • 第一步:后端隨機產生一個token,把這個token保存在SESSION狀態中;同時,后端把這個token交給前端頁面;
  • 第二步:下次前端需要發起請求(比如發帖)的時候把這個token加入到請求數據或者頭信息中,一起傳給后端;
  • 第三步:后端校驗前端請求帶過來的token和SESSION里的token是否一致;

上文提到過,前后端分離狀態下,Nodejs是不具備SESSION功能的。那這種token防御機制是不是就無法實現了呢?

肯定不是。我們可以借助cookie把這個流程升級下:

  • 第一步:后端隨機產生一個token,基于這個token通過SHA-56等散列算法生成一個密文;
  • 第二步:后端將這個token和生成的密文都設置為cookie,返回給前端;
  • 第三步:前端需要發起請求的時候,從cookie中獲取token,把這個token加入到請求數據或者頭信息中,一起傳給后端;
  • 第四步:后端校驗cookie中的密文,以及前端請求帶過來的token,進行正向散列驗證;

當然這樣實現也有需要注意的:

  • 散列算法都是需要計算的,這里會有性能風險;
  • token參數必須由前端處理之后交給后端,而不能直接通過cookie;
  • cookie更臃腫,會不可避免地讓頭信息更重;

現在方案確定了,具體該如何實現呢?

2、具體實現

我們的技術棧是 koa(服務端) + Vue.js(前端) 。有興趣可以看這些資料:

在服務端,實現了一個token生成的中間件,koa-grace-csrf:

  1. // 注意:代碼有做精簡 
  2.   
  3.  const tokens = require('./lib/tokens'); 
  4.  return function* csrf(next) { 
  5.    let curSecret = this.cookies.get('密文的cookie'); 
  6.    // 其他如果要獲取參數,則為配置參數值 
  7.    let curToken = '請求http頭信息中的token'
  8.     
  9.    // token不存在 
  10.    if (!curToken || !curSecret) { 
  11.      return this.throw('CSRF Token Not Found!',403) 
  12.    } 
  13.  
  14.    // token校驗失敗 
  15.    if (!tokens.verify(curSecret, curToken)) { 
  16.      return this.throw('CSRF token Invalid!',403) 
  17.    } 
  18.  
  19.    yield next
  20.  
  21.    // 無論何種情況都種兩個cookie 
  22.    // cookie_key: 當前token的cookie_key,httpOnly 
  23.    let secret = tokens.secretSync(); 
  24.    this.cookies.set(options.cookie_key, secret); 
  25.    // cookie_token: 當前token的的content,不需要httpOnly 
  26.    let newToken = tokens.create(secret); 
  27.    this.cookies.set(options.cookie_token, newToken) 
  28.  }  

在前端代碼中,對發送ajax請求的封裝稍作優化: 

  1. this.$http.post(url, data, { 
  2.       headers: { 
  3.           'http請求頭信息字段名''cookie中的token' 
  4.       } 
  5.   }).then((res) => {})  

總結一下:

  • Nodejs生成一個隨機數,通過隨機數生成散列密文;并將隨機數和密文存到cookie;
  • 客戶端JS獲取cookie中的隨機數,通過http頭信息交給Nodejs;
  • Nodejs響應請求,校驗cookie中的密文和頭信息中的隨機數是否匹配;

這里依舊有個細節值得提一下:Nodejs的上層一般是nginx,而nginx默認會過濾頭信息中不合法的字段(比如頭信息字段名包含“_”的),這里在寫頭信息的時候需要注意。

上文也提到,通過cookie及http頭信息傳遞加密token會有很多弊端;有沒有更優雅的實現方案呢?

3、更優雅的架構

首先,我們明確前后端分離的一些基本原則:

后端(Java / PHP )職責:

  • 服務層顆粒化接口,以便前端Nodejs層異步并發調用;
  • 用戶狀態保存,實現用戶權限等各種功能;

前端(Nodejs + Javascript)職責:

  • Nodejs層完成路由托管及模板引擎渲染功能
  • Nodejs層不負責實現任何SESSION和數據庫功能

我們提到,前端Nodejs層不負責實現任何SESSION和數據庫功能,但有沒有可能把后端緩存系統做成公共服務提供給Nodejs層使用呢?想想感覺前端整條路都亮了有木有?!這里先挖一個坑,后續慢慢填。

4、延伸

這里再順便提一下,新架構下的XSS防御。

猶記得,在狼廠使用PHP的年代,經常被安全部門曝出各類XSS漏洞,然后就在smaty里添加各種escape濾鏡,但是添加之后發現竟然把原始數據也給轉義了。

當然,現在更多要歸功于各種MVVM單頁面應用:使得前端完全不需要通過讀取URL中的參數來控制VIEW。

不過,還有一點值得一提:前后端分離框架下,路由由Nodejs控制;我自己要獲取的后端參數和需要用在業務邏輯的參數,在主觀上前端同學更好把握一些。

所以, 在koa(服務端) + Vue.js(前端)架構下基本不用顧慮XSS問題(至少不會被全安組追著問XSS漏洞啥時候修復)。

總結

要不學PHP、看Java、玩Python做全棧好了?

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2016-09-29 22:54:55

2019-06-12 19:00:14

前后端分離AppJava

2012-02-20 14:57:59

殺毒軟件漏洞安全

2017-02-15 10:18:32

架構前后端分離

2017-11-15 07:01:33

互聯網分層架構前后端

2023-02-08 16:29:58

前后端開發

2018-01-26 17:36:12

2020-10-25 10:40:41

Windows

2021-09-18 09:45:33

前端接口架構

2020-09-29 07:42:34

互聯網分層架構前后端分離

2017-11-06 08:41:53

互聯網分層架構前后端

2025-02-10 08:39:17

2014-04-18 14:43:07

前后端分離NodeJS

2020-09-25 11:50:12

前后端分離架構Web

2021-10-20 18:21:18

項目技術開發

2019-07-09 05:44:35

前后端分離架構接口規范

2022-04-06 07:50:57

JWT后端Spring

2014-02-17 17:40:13

系統架構Web架構

2015-10-20 18:43:43

2021-06-03 10:16:12

CSRF攻擊SpringBoot
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美xxxx黑人又粗又长 | 久久综合一区 | 在线观看中文字幕dvd播放 | 999久久精品 | 欧美区日韩区 | 黄网站在线播放 | 欧洲一区视频 | 涩在线 | 日韩三级在线观看 | 国产一区二区在线免费视频 | 日韩精品在线视频 | 亚洲一区二区在线视频 | 欧美日韩在线一区二区 | 亚洲网在线 | 欧美区日韩区 | 中文字幕一区二区三区精彩视频 | 亚欧午夜| 欧美性猛交一区二区三区精品 | 国产一级在线观看 | 免费网站在线 | 在线视频一区二区 | 亚洲国产成人精品一区二区 | 亚洲一区二区三区久久 | 日一区二区 | 欧美日韩成人 | 亚洲一区二区精品视频在线观看 | 日韩视频在线一区 | 蜜臀久久99精品久久久久野外 | 久久精品二区 | 春色av| 18gay男同69亚洲网站 | 三级在线视频 | 久久精品国产免费看久久精品 | 久久伊人久久 | 99视频免费播放 | 日本成人三级电影 | 国产一区二区三区视频免费观看 | 欧美区在线 | av一级一片 | av在线免费观看网址 | 激情三区|