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

前后端分離架構(gòu)下CSRF防御機(jī)制

安全 黑客攻防
如果來(lái)不及了解CSRF的原理,可以這么理解:有一個(gè)人發(fā)給你一個(gè)搞(mei)笑(nv)圖片鏈接,你打開(kāi)這個(gè)鏈接之后,便立刻收到了短信:你的銀行里的錢(qián)已經(jīng)轉(zhuǎn)移到這個(gè)人的帳戶(hù)了。

[[171798]]

背景

1、什么是CSRF攻擊?

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

不太了解的同學(xué)可以看這兩篇對(duì)CSRF介紹比較詳細(xì)的參考文章:

如果來(lái)不及了解CSRF的原理,可以這么理解:有一個(gè)人發(fā)給你一個(gè)搞(mei)笑(nv)圖片鏈接,你打開(kāi)這個(gè)鏈接之后,便立刻收到了短信:你的銀行里的錢(qián)已經(jīng)轉(zhuǎn)移到這個(gè)人的帳戶(hù)了。

2、有哪些防御方案?

上面這個(gè)例子當(dāng)然有點(diǎn)危言聳聽(tīng),當(dāng)然可以確定的是確實(shí)會(huì)有這樣的漏洞:你打開(kāi)了一個(gè)未知域名的鏈接,然后你就自動(dòng)發(fā)了條廣告帖子、你的Gmail的郵件內(nèi)容就泄露了、你的百度登錄狀態(tài)就沒(méi)了……

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

  • 用戶(hù)操作限制,比如驗(yàn)證碼;
  • 請(qǐng)求來(lái)源限制,比如限制HTTP Referer才能完成操作;
  • token驗(yàn)證機(jī)制,比如請(qǐng)求數(shù)據(jù)字段中添加一個(gè)token,響應(yīng)請(qǐng)求時(shí)校驗(yàn)其有效性;

第一種方案明顯嚴(yán)重影響了用戶(hù)體驗(yàn),而且還有額外的開(kāi)發(fā)成本;第二種方案成本最低,但是并不能保證100%安全,而且很有可能會(huì)埋坑;第三種方案,可取!

token驗(yàn)證的CSRF防御機(jī)制是公認(rèn)最合適的方案,也是本文討論的重點(diǎn)。

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

《CSRF 攻擊的應(yīng)對(duì)之道》這篇文章里有提到:

要把所有請(qǐng)求都改為 XMLHttpRequest 請(qǐng)求,這樣幾乎是要重寫(xiě)整個(gè)網(wǎng)站,這代價(jià)無(wú)疑是不能接受的

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

當(dāng)然, 前端不要高興的太早:前后端分離之后,Nodejs不具備完善的服務(wù)端SESSION、數(shù)據(jù)庫(kù)等功能。

總結(jié)一下,在“更先進(jìn)”的前端架構(gòu)下,與以往的架構(gòu)會(huì)有一些區(qū)別:

  • Nodejs層不處理SESSION,無(wú)法直接實(shí)現(xiàn)會(huì)話狀態(tài)數(shù)據(jù)保存;
  • 所有的數(shù)據(jù)通過(guò)Ajax異步獲取,可以靈活實(shí)現(xiàn)token方案;

實(shí)現(xiàn)思路

如上文提到,這里僅僅討論在“更先進(jìn)”的前端后端架構(gòu)背景下的token防御方案的實(shí)現(xiàn)。

1、可行性方案

token防御的整體思路是:

  • 第一步:后端隨機(jī)產(chǎn)生一個(gè)token,把這個(gè)token保存在SESSION狀態(tài)中;同時(shí),后端把這個(gè)token交給前端頁(yè)面;
  • 第二步:下次前端需要發(fā)起請(qǐng)求(比如發(fā)帖)的時(shí)候把這個(gè)token加入到請(qǐng)求數(shù)據(jù)或者頭信息中,一起傳給后端;
  • 第三步:后端校驗(yàn)前端請(qǐng)求帶過(guò)來(lái)的token和SESSION里的token是否一致;

上文提到過(guò),前后端分離狀態(tài)下,Nodejs是不具備SESSION功能的。那這種token防御機(jī)制是不是就無(wú)法實(shí)現(xiàn)了呢?

肯定不是。我們可以借助cookie把這個(gè)流程升級(jí)下:

  • 第一步:后端隨機(jī)產(chǎn)生一個(gè)token,基于這個(gè)token通過(guò)SHA-56等散列算法生成一個(gè)密文;
  • 第二步:后端將這個(gè)token和生成的密文都設(shè)置為cookie,返回給前端;
  • 第三步:前端需要發(fā)起請(qǐng)求的時(shí)候,從cookie中獲取token,把這個(gè)token加入到請(qǐng)求數(shù)據(jù)或者頭信息中,一起傳給后端;
  • 第四步:后端校驗(yàn)cookie中的密文,以及前端請(qǐng)求帶過(guò)來(lái)的token,進(jìn)行正向散列驗(yàn)證;

當(dāng)然這樣實(shí)現(xiàn)也有需要注意的:

  • 散列算法都是需要計(jì)算的,這里會(huì)有性能風(fēng)險(xiǎn);
  • token參數(shù)必須由前端處理之后交給后端,而不能直接通過(guò)cookie;
  • cookie更臃腫,會(huì)不可避免地讓頭信息更重;

現(xiàn)在方案確定了,具體該如何實(shí)現(xiàn)呢?

2、具體實(shí)現(xiàn)

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

在服務(wù)端,實(shí)現(xiàn)了一個(gè)token生成的中間件,koa-grace-csrf:

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

在前端代碼中,對(duì)發(fā)送ajax請(qǐng)求的封裝稍作優(yōu)化: 

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

總結(jié)一下:

  • Nodejs生成一個(gè)隨機(jī)數(shù),通過(guò)隨機(jī)數(shù)生成散列密文;并將隨機(jī)數(shù)和密文存到cookie;
  • 客戶(hù)端JS獲取cookie中的隨機(jī)數(shù),通過(guò)http頭信息交給Nodejs;
  • Nodejs響應(yīng)請(qǐng)求,校驗(yàn)cookie中的密文和頭信息中的隨機(jī)數(shù)是否匹配;

這里依舊有個(gè)細(xì)節(jié)值得提一下:Nodejs的上層一般是nginx,而nginx默認(rèn)會(huì)過(guò)濾頭信息中不合法的字段(比如頭信息字段名包含“_”的),這里在寫(xiě)頭信息的時(shí)候需要注意。

上文也提到,通過(guò)cookie及http頭信息傳遞加密token會(huì)有很多弊端;有沒(méi)有更優(yōu)雅的實(shí)現(xiàn)方案呢?

3、更優(yōu)雅的架構(gòu)

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

后端(Java / PHP )職責(zé):

  • 服務(wù)層顆粒化接口,以便前端Nodejs層異步并發(fā)調(diào)用;
  • 用戶(hù)狀態(tài)保存,實(shí)現(xiàn)用戶(hù)權(quán)限等各種功能;

前端(Nodejs + Javascript)職責(zé):

  • Nodejs層完成路由托管及模板引擎渲染功能
  • Nodejs層不負(fù)責(zé)實(shí)現(xiàn)任何SESSION和數(shù)據(jù)庫(kù)功能

我們提到,前端Nodejs層不負(fù)責(zé)實(shí)現(xiàn)任何SESSION和數(shù)據(jù)庫(kù)功能,但有沒(méi)有可能把后端緩存系統(tǒng)做成公共服務(wù)提供給Nodejs層使用呢?想想感覺(jué)前端整條路都亮了有木有?!這里先挖一個(gè)坑,后續(xù)慢慢填。

4、延伸

這里再順便提一下,新架構(gòu)下的XSS防御。

猶記得,在狼廠使用PHP的年代,經(jīng)常被安全部門(mén)曝出各類(lèi)XSS漏洞,然后就在smaty里添加各種escape濾鏡,但是添加之后發(fā)現(xiàn)竟然把原始數(shù)據(jù)也給轉(zhuǎn)義了。

當(dāng)然,現(xiàn)在更多要?dú)w功于各種MVVM單頁(yè)面應(yīng)用:使得前端完全不需要通過(guò)讀取URL中的參數(shù)來(lái)控制VIEW。

不過(guò),還有一點(diǎn)值得一提:前后端分離框架下,路由由Nodejs控制;我自己要獲取的后端參數(shù)和需要用在業(yè)務(wù)邏輯的參數(shù),在主觀上前端同學(xué)更好把握一些。

所以, 在koa(服務(wù)端) + Vue.js(前端)架構(gòu)下基本不用顧慮XSS問(wèn)題(至少不會(huì)被全安組追著問(wèn)XSS漏洞啥時(shí)候修復(fù))。

總結(jié)

要不學(xué)PHP、看Java、玩Python做全棧好了?

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

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

架構(gòu)前后端分離

2017-11-15 07:01:33

互聯(lián)網(wǎng)分層架構(gòu)前后端

2023-02-08 16:29:58

前后端開(kāi)發(fā)

2018-01-26 17:36:12

2020-10-25 10:40:41

Windows

2021-09-18 09:45:33

前端接口架構(gòu)

2020-09-29 07:42:34

互聯(lián)網(wǎng)分層架構(gòu)前后端分離

2017-11-06 08:41:53

互聯(lián)網(wǎng)分層架構(gòu)前后端

2025-02-10 08:39:17

2014-04-18 14:43:07

前后端分離NodeJS

2020-09-25 11:50:12

前后端分離架構(gòu)Web

2021-10-20 18:21:18

項(xiàng)目技術(shù)開(kāi)發(fā)

2019-07-09 05:44:35

前后端分離架構(gòu)接口規(guī)范

2014-02-17 17:40:13

系統(tǒng)架構(gòu)Web架構(gòu)

2015-10-20 18:43:43

2021-06-03 10:16:12

CSRF攻擊SpringBoot

2022-04-06 07:50:57

JWT后端Spring
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩精品在线播放 | 国产高清在线精品一区二区三区 | 精品不卡 | 毛片一区二区三区 | 九九热国产视频 | 4hu最新网址 | 精品国产视频在线观看 | 欧美一区二区三区在线看 | 99亚洲综合 | www.伊人.com | 国产欧美一区二区三区日本久久久 | 久久久久国产视频 | 一二区视频 | 亚洲高清av在线 | 日韩在线免费电影 | 国产欧美一区二区精品久导航 | 国产黄色av网站 | 久久6视频| 亚洲国产一区视频 | 中文字幕免费 | 午夜小视频在线播放 | 精品一区二区久久久久久久网站 | 午夜丰满少妇一级毛片 | aaaaaaa片毛片免费观看 | 中文字幕色站 | 一区二区三区中文字幕 | 国产成人高清成人av片在线看 | 黄视频欧美 | 日韩在线观看一区 | 日韩精品一区二区三区四区 | 精品伊人久久 | 日本午夜在线视频 | 日韩精品一区二区三区中文在线 | 亚洲一区免费视频 | 亚洲天天干 | 国产伦精品一区二区三区在线 | 五月婷婷在线播放 | 99亚洲综合 | 97精品国产97久久久久久免费 | 91免费在线看 | 日韩在线视频播放 |