一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Golang - Go語言中如何確保Cookie數據的安全傳輸

Go語言中如何確保Cookie數據的安全傳輸

2020-06-07 11:30Kevin Golang

這篇文章主要介紹了Go語言中如何確保Cookie數據的安全傳輸,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

什么是Cookie

Cookie(也叫Web Cookie或瀏覽器Cookie)是服務器發送到用戶瀏覽器并保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶并發送到服務器上。通常,它用于告知服務端兩個請求是否來自同一瀏覽器,如保持用戶的登錄狀態。Cookie使基于無狀態的HTTP協議記錄穩定的狀態信息成為了可能。

Cookie主要用于以下三個方面:

  • 會話狀態管理(如用戶登錄狀態、購物車、游戲分數或其它需要記錄的信息)
  • 個性化設置(如用戶自定義設置、主題等)
  • 瀏覽器行為跟蹤(如跟蹤分析用戶行為等)

Go語言如何表示Cookie

在Go的net/http庫中使用http.Cookie結構體表示一個Cookie數據,調用http.SetCookie函數則會告訴終端用戶的瀏覽器把給定的http.Cookie值設置到瀏覽器Cookie里,類似下面:

?
1
2
3
4
5
6
7
func someHandler(w http.ResponseWriter, r *http.Request) {
 c := http.Cookie{
  Name: "UserName",
  Value: "Casey",
 }
 http.SetCookie(w, &c)
}

http.Cookie結構體類型的定義如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type Cookie struct {
  Name string
  Value string
 
  Path    string  // optional
  Domain   string  // optional
  Expires  time.Time // optional
  RawExpires string  // for reading cookies only
 
  // MaxAge=0 means no 'Max-Age' attribute specified.
  // MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
  // MaxAge>0 means Max-Age attribute present and given in seconds
  MaxAge  int
  Secure  bool
  HttpOnly bool
  SameSite SameSite
  Raw   string
  Unparsed []string // Raw text of unparsed attribute-value pairs
}

Name和Value字段就不多說了,單獨針對幾個需要解釋的字段進行說明。

Domain

默認值是當前正在訪問的Host的域名,假設我們現在正在訪問的是www.example.com,如果需要其他子域名也能夠訪問到正在設置的Cookie值的話,將它設置為example.com 。注意,只有正在被設置的Cookie需要被其他子域名的服務訪問到時才這么設置。

?
1
2
3
4
c := Cookie{
 ......
 Domain: "example.com",
}

Path

設置當前的 Cookie 值只有在訪問指定路徑時才能被服務器程序讀取。默認為服務端應用程序上的任何路徑,但是您可以使用它限制為特定的子目錄。例如:

?
1
2
3
c := Cookie{
 Path: "/app/",
}

Secure

標記為Secure 的Cookie只應通過被HTTPS協議加密過的請求發送給服務端。但即便設置了 Secure 標記,敏感信息也不應該通過Cookie傳輸,因為Cookie有其固有的不安全性,Secure 標記也無法提供確實的安全保障。從 Chrome 52 和 Firefox 52 開始,不安全的站點(http:)無法使用Cookie的 Secure 標記。

HttpOnly

為避免跨域腳本 (XSS) 攻擊,通過JavaScript的API無法訪問帶有 HttpOnly 標記的Cookie,它們只應該發送給服務端。如果包含服務端Session 信息的Cookie 不想被客戶端JavaScript 腳本調用,那么就應該為其設置 HttpOnly 標記。

安全地傳輸Cookie

接下來我們探討兩種安全傳輸Cookie的方法

對Cookie數據進行數字簽名

對數據進行數字簽名是在數據上添加“簽名”的行為,以便可以驗證其真實性。不需要對數據進行加密或屏蔽。

簽名的工作方式是通過散列-我們對數據進行散列,然后將數據與數據散列一起存儲在Cookie中。然后,當用戶將Cookie發送給我們時,我們再次對數據進行哈希處理,并驗證其是否與我們創建的原始哈希匹配。

我們不希望用戶也用篡改后的數據創建新的哈希,因此經常會看到使用HMAC之類的哈希算法,以便可以使用密鑰對數據進行哈希。這樣可以防止最終用戶同時編輯數據和數字簽名(哈希)。

JWT也是使用的這種數字簽名的方式進行傳輸的。

上面的數據簽名過程并不需要我們自己去實現,我們可以在Go中使用gorilla/securecookie的程序包來完成此操作,在該程序包中,你可以在創建SecureCookie時為其提供哈希密鑰,然后使用該對象來保護你的Cookie。

對Cookie數據進行簽名:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//var s = securecookie.New(hashKey, blockKey)
var hashKey = securecookie.GenerateRandomKey(64)
var s = securecookie.New(hashKey, nil)
 
func SetCookieHandler(w http.ResponseWriter, r *http.Request) {
 encoded, err := s.Encode("cookie-name", "cookie-value")
 if err == nil {
  cookie := &http.Cookie{
   Name: "cookie-name",
   Value: encoded,
   Path: "/",
  }
  http.SetCookie(w, cookie)
  fmt.Fprintln(w, encoded)
 }

解析被簽名的 Cookie:

?
1
2
3
4
5
6
7
8
func ReadCookieHandler(w http.ResponseWriter, r *http.Request) {
 if cookie, err := r.Cookie("cookie-name"); err == nil {
  var value string
  if err = s.Decode("cookie-name", cookie.Value, &value); err == nil {
   fmt.Fprintln(w, value)
  }
 }
}

注意這里的Cookie數據未加密,僅僅是被編碼了,任何人都可以把Cookie數據解碼回來。

加密Cookie 數據

每當將數據存儲在Cookie中時,請始終盡量減少存儲在Cookie中的敏感數據量。不要存儲用戶密碼之類的東西,并確保任何編碼數據也沒有此信息。在某些情況下,開發人員在不知不覺中將敏感數據存儲在Cookie或JWT中,因為它們是base64編碼的,但實際上任何人都可以解碼該數據。它已編碼,未加密。

這是一個很大的錯誤,因此,如果你擔心意外存儲敏感內容,建議 你使用gorilla/securecookie之類的軟件包。

之前我們討論了如何將其用于對Cookie進行數字簽名,但是securecookie也可以用于加密和解密Cookie數據,以使其無法輕松解碼和讀取。

要使用該軟件包加密Cookie,只需在創建SecureCookie實例時傳入一個blockKey即可。

將上面簽名Cookie的代碼片段進行一些小改動,其他地方完全不用動,securecookie包會幫助我們進行Cookie的加密和解密:

?
1
2
3
var hashKey = securecookie.GenerateRandomKey(64)
var blockKey = securecookie.GenerateRandomKey(32)
var s = securecookie.New(hashKey, blockKey)

總結

今天的文章除了闡述如何使用Go語言安全地傳輸Cookie數據外,再次格外強調一遍,編碼和加密的不同,從數據可讀性上看,兩者差不多,但本質上是完全不一樣的:

  • 編碼使用公開可用的方案將數據轉換為另一種格式,以便可以輕松地將其反轉。
  • 加密將數據轉換為另一種格式,使得只有特定的個人才能逆轉轉換。

我們在做數據傳輸時一定要記住兩者的區別,某種意義上,我覺得記住這兩點的區別比你學會今天文章里怎么安全傳輸Cookie更重要。

到此這篇關于Go語言中如何確保Cookie數據的安全傳輸的文章就介紹到這了,更多相關Go Cookie數據傳輸內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://segmentfault.com/a/1190000021949077

延伸 · 閱讀

精彩推薦
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網11352020-05-21
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

    這篇文章主要介紹了Golang通脈之數據類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數名等等,Go語言中標識符允許由...

    4272021-11-24
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

    這篇文章主要介紹了Golang中Bit數組的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
主站蜘蛛池模板: 亚洲国产欧美在线人成aaa | jzz大全部 | 97蝌蚪自拍自窝 | 日本一区二区三区国产 | 国产精品亚洲综合久久 | 久久天天综合 | 男人操女人免费视频 | 国产日韩欧美综合一区二区三区 | 91天堂素人97年清纯嫩模 | 成人午夜在线视频 | 91入口免费网站大全 | jazz中国女人护士 | 香蕉久久ac一区二区三区 | 亚洲国产美女精品久久 | a性片| 男人天堂资源 | 日本四虎影视 | 国产亚洲高清国产拍精品 | 国产精品视频免费一区二区三区 | 亚洲国产自拍在线 | 99国产情在线视频 | 九九精品视频在线观看 | 92福利网 | 亚洲视频精选 | 91精品国产美女福到在线不卡 | 肉色欧美久久久久久久蜜桃 | 亚洲精品久久久久久婷婷 | 动漫美女胸被狂揉扒开吃奶动态图 | 日本天堂视频在线观看 | 视频在线观看一区二区 | 丝瓜香蕉视频 | 星空无限传媒xk8027穆娜 | 日韩欧美国产在线 | 亚洲欧美国产在线 | www.91麻豆 | 国产午夜精品一区二区 | 午夜免费无码福利视频麻豆 | 色综合久久夜色精品国产 | 精品国产剧情在线观看 | 精品在线视频一区 | www日本高清视频 |