【Go開源寶藏】CORS 跨域 與 CSRF攻擊 | 中介軟體

語言: CN / TW / HK

本文已參與 「掘力星計劃」 ,贏取創作大禮包,挑戰創作激勵金

在這裡插入圖片描述

1. 什麼是跨域

當一個請求url的協議域名三者之間任意一個與當前頁面url不同即為跨域

| 當前頁面url | 被請求頁面url | 是否跨域 | 原因 |--|--|--|--| http://www.test.com/| http://www.test.com/index.html |否 |同源(協議、域名、埠號相同) http://www.test.com/| https://www.test.com/index.html |跨域 |協議不同(http/https) http://www.test.com/| http://www.baidu.com/ |跨域 |主域名不同(test/baidu) http://www.test.com/ |http://blog.test.com/ |跨域 |子域名不同(www/blog) http://www.test.com:8080/ |http://www.test.com:7001/ |跨域 |埠號不同(8080/7001)

因為域的不一致,與此同時由於安全問題,請求就會受到同源策略限制

通常,瀏覽器會對跨域請求作出限制。 瀏覽器之所以要對跨域請求作出限制,是出於安全方面的考慮,因為跨域請求有可能被不法分子利用來發動 CSRF攻擊。

2. CSRF攻擊

2.1 CSRF說明

CSRF(Cross-site request forgery)中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。 CSRF攻擊者在使用者已經登入目標網站之後,誘使使用者訪問一個攻擊頁面,利用目標網站對使用者的信任,以使用者身份在攻擊頁面對目標網站發起偽造使用者操作的請求,達到攻擊目的。

2.1 原理

​ CSRF 攻擊的原理大致描述如下: 1. 有兩個網站,其中A網站是真實受信任的網站,而B網站是危險網站。 2. 在使用者登陸了受信任的A網站是,本地會儲存A網站相關的Cookie,並且瀏覽器也維護這一個Session會話。 3. 這時,如果使用者在沒有登出A網站的情況下訪問危險網站B,那麼危險網站B就可以模擬發出一個對A網站的請求(跨域請求)對A網站進行操作 4. 而在A網站的角度來看是並不知道請求是由B網站發出來的(Session和Cookie均為A網站的),這時便成功發動一次 CSRF 攻擊。

​ 因而 CSRF 攻擊可以簡單理解為:攻擊者盜用了你的身份,以你的名義傳送請求

CSRF能夠做的事情包括:以你名義傳送郵件,發訊息,盜取你的賬號,甚至於購買商品,虛擬貨幣轉賬......造成的問題包括:個人隱私洩露以及財產安全。

3. CORS

3.1 簡介

跨源資源共享 Cross-Origin Resource Sharing(CORS) 是一個新的 W3C 標準,它新增的一組HTTP首部欄位,允許服務端其宣告哪些源站有許可權訪問哪些資源。

換言之,它允許瀏覽器向聲明瞭 CORS 的跨域伺服器,發出 XMLHttpReuest 請求,從而克服 Ajax 只能同源使用的限制

簡單介紹一下CORS中新增的 HTTP 首部欄位

  • Access-Control-Allow-Origin 響應首部中可以攜帶這個頭部表示伺服器允許哪些域可以訪問該資源 go c.Header("Access-Control-Allow-Origin", "*")

  • Access-Control-Allow-Methods 預檢請求的響應,指明實際請求所允許使用的HTTP方法

go c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")

  • Access-Control-Allow-Headers 首部欄位用於預檢請求的響應,指明瞭實際請求中允許攜帶的首部欄位 go c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma")

  • Access-Control-Max-Age 首部欄位用於預檢請求的響應,指定了預檢請求能夠被快取多久。 go c.Header("Access-Control-Max-Age", "172800")

  • Access-Control-Allow-Credentials 首部欄位用於預檢請求的響應,指明實際請求所允許使用的HTTP方法。

go c.Header("Access-Control-Allow-Credentials", "false")

3.2 引用

在中介軟體中設定編寫即可!

go func Cors() gin.HandlerFunc { return func(c *gin.Context) { method := c.Request.Method //請求方法 origin := c.Request.Header.Get("Origin") //請求頭部 var headerKeys []string // 宣告請求頭keys for k := range c.Request.Header { headerKeys = append(headerKeys, k) } headerStr := strings.Join(headerKeys, ", ") if headerStr != "" { headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers, %s", headerStr) } else { headerStr = "access-control-allow-origin, access-control-allow-headers" } if origin != "" { c.Writer.Header().Set("Access-Control-Allow-Origin", "*") c.Header("Access-Control-Allow-Origin", "*") // 這是允許訪問所有域 c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE") //伺服器支援的所有跨域請求的方法,為了避免瀏覽次請求的多次'預檢'請求 // header的型別 c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma") // 允許跨域設定,可以返回其他子段 c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar") // 跨域關鍵設定 讓瀏覽器可以解析 c.Header("Access-Control-Max-Age", "172800") // 快取請求資訊 單位為秒 c.Header("Access-Control-Allow-Credentials", "false") // 跨域請求是否需要帶cookie資訊 預設設定為true c.Set("content-type", "application/json") // 設定返回格式是json } //放行所有OPTIONS方法 if method == "OPTIONS" { c.JSON(http.StatusOK, "Options Request!") } c.Next() // 處理請求 } }

配合gin框架使用

go r:=gin.Default() r.Use(middleware.Cors())

參考文獻 1、https://www.jianshu.com/p/f880878c1398 2、https://blog.csdn.net/qq_38128179/article/details/84956552