目錄
- 1. 什么是跨域
- 2. CSRF攻擊
- 2.1 CSRF說明
- 2.1 原理
- 3. CORS
- 3.1 簡介
- 3.2 參考

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 攻擊的原理大致描述如下:
- 有兩個網站,其中A網站是真實受信任的網站,而B網站是危險網站,
- 在用戶登陸了受信任的A網站是,本地會存盤A網站相關的Cookie,并且瀏覽器也維護這一個Session會話,
- 這時,如果用戶在沒有登出A網站的情況下訪問危險網站B,那么危險網站B就可以模擬發出一個對A網站的請求(跨域請求)對A網站進行操作
- 而在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
回應首部中可以攜帶這個頭部表示服務器允許哪些域可以訪問該資源
c.Header("Access-Control-Allow-Origin", "*")
- Access-Control-Allow-Methods
預檢請求的回應,指明實際請求所允許使用的HTTP方法
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")
- Access-Control-Allow-Headers
首部欄位用于預檢請求的回應,指明了實際請求中允許攜帶的首部欄位
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
首部欄位用于預檢請求的回應,指定了預檢請求能夠被快取多久,
c.Header("Access-Control-Max-Age", "172800")
- Access-Control-Allow-Credentials
首部欄位用于預檢請求的回應,指明實際請求所允許使用的HTTP方法,
c.Header("Access-Control-Allow-Credentials", "false")
3.2 參考
在中間件中設定撰寫即可!
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框架使用
r:=gin.Default()
r.Use(middleware.Cors())
參考文獻
1、https://www.jianshu.com/p/f880878c1398
2、https://blog.csdn.net/qq_38128179/article/details/84956552
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/321000.html
標籤:其他
上一篇:『Java面經』ThreadLocal 實作原理是什么 & 有哪些參考型別及使用場景?
下一篇:“入侵5G手機”Black Hat USA 2021:通過無線基帶-針對5G智能手機的RCE遠程代碼執行攻擊白皮書
