最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言中如何確保Cookie數(shù)據(jù)的安全傳輸

 更新時(shí)間:2020年03月08日 16:36:12   作者:Kevin  
這篇文章主要介紹了Go語(yǔ)言中如何確保Cookie數(shù)據(jù)的安全傳輸,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

什么是Cookie

Cookie(也叫Web Cookie或?yàn)g覽器Cookie)是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù),它會(huì)在瀏覽器下次向同一服務(wù)器再發(fā)起請(qǐng)求時(shí)被攜帶并發(fā)送到服務(wù)器上。通常,它用于告知服務(wù)端兩個(gè)請(qǐng)求是否來(lái)自同一瀏覽器,如保持用戶的登錄狀態(tài)。Cookie使基于無(wú)狀態(tài)的HTTP協(xié)議記錄穩(wěn)定的狀態(tài)信息成為了可能。

Cookie主要用于以下三個(gè)方面:

  • 會(huì)話狀態(tài)管理(如用戶登錄狀態(tài)、購(gòu)物車、游戲分?jǐn)?shù)或其它需要記錄的信息)
  • 個(gè)性化設(shè)置(如用戶自定義設(shè)置、主題等)
  • 瀏覽器行為跟蹤(如跟蹤分析用戶行為等)

Go語(yǔ)言如何表示Cookie

在Go的net/http庫(kù)中使用http.Cookie結(jié)構(gòu)體表示一個(gè)Cookie數(shù)據(jù),調(diào)用http.SetCookie函數(shù)則會(huì)告訴終端用戶的瀏覽器把給定的http.Cookie值設(shè)置到瀏覽器Cookie里,類似下面:

func someHandler(w http.ResponseWriter, r *http.Request) {
 c := http.Cookie{
  Name: "UserName",
  Value: "Casey",
 }
 http.SetCookie(w, &c)
}

http.Cookie結(jié)構(gòu)體類型的定義如下:

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字段就不多說(shuō)了,單獨(dú)針對(duì)幾個(gè)需要解釋的字段進(jìn)行說(shuō)明。

Domain

默認(rèn)值是當(dāng)前正在訪問的Host的域名,假設(shè)我們現(xiàn)在正在訪問的是www.example.com,如果需要其他子域名也能夠訪問到正在設(shè)置的Cookie值的話,將它設(shè)置為example.com 。注意,只有正在被設(shè)置的Cookie需要被其他子域名的服務(wù)訪問到時(shí)才這么設(shè)置。

c := Cookie{
 ......
 Domain: "example.com",
}

Path

設(shè)置當(dāng)前的 Cookie 值只有在訪問指定路徑時(shí)才能被服務(wù)器程序讀取。默認(rèn)為服務(wù)端應(yīng)用程序上的任何路徑,但是您可以使用它限制為特定的子目錄。例如:

c := Cookie{
 Path: "/app/",
}

Secure

標(biāo)記為Secure 的Cookie只應(yīng)通過(guò)被HTTPS協(xié)議加密過(guò)的請(qǐng)求發(fā)送給服務(wù)端。但即便設(shè)置了 Secure 標(biāo)記,敏感信息也不應(yīng)該通過(guò)Cookie傳輸,因?yàn)镃ookie有其固有的不安全性,Secure 標(biāo)記也無(wú)法提供確實(shí)的安全保障。從 Chrome 52 和 Firefox 52 開始,不安全的站點(diǎn)(http:)無(wú)法使用Cookie的 Secure 標(biāo)記。

HttpOnly

為避免跨域腳本 (XSS) 攻擊,通過(guò)JavaScript的API無(wú)法訪問帶有 HttpOnly 標(biāo)記的Cookie,它們只應(yīng)該發(fā)送給服務(wù)端。如果包含服務(wù)端Session 信息的Cookie 不想被客戶端JavaScript 腳本調(diào)用,那么就應(yīng)該為其設(shè)置 HttpOnly 標(biāo)記。

安全地傳輸Cookie

接下來(lái)我們探討兩種安全傳輸Cookie的方法

對(duì)Cookie數(shù)據(jù)進(jìn)行數(shù)字簽名

對(duì)數(shù)據(jù)進(jìn)行數(shù)字簽名是在數(shù)據(jù)上添加“簽名”的行為,以便可以驗(yàn)證其真實(shí)性。不需要對(duì)數(shù)據(jù)進(jìn)行加密或屏蔽。

簽名的工作方式是通過(guò)散列-我們對(duì)數(shù)據(jù)進(jìn)行散列,然后將數(shù)據(jù)與數(shù)據(jù)散列一起存儲(chǔ)在Cookie中。然后,當(dāng)用戶將Cookie發(fā)送給我們時(shí),我們?cè)俅螌?duì)數(shù)據(jù)進(jìn)行哈希處理,并驗(yàn)證其是否與我們創(chuàng)建的原始哈希匹配。

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

JWT也是使用的這種數(shù)字簽名的方式進(jìn)行傳輸?shù)摹?/p>

上面的數(shù)據(jù)簽名過(guò)程并不需要我們自己去實(shí)現(xiàn),我們可以在Go中使用gorilla/securecookie的程序包來(lái)完成此操作,在該程序包中,你可以在創(chuàng)建SecureCookie時(shí)為其提供哈希密鑰,然后使用該對(duì)象來(lái)保護(hù)你的Cookie。

對(duì)Cookie數(shù)據(jù)進(jìn)行簽名:

//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:

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數(shù)據(jù)未加密,僅僅是被編碼了,任何人都可以把Cookie數(shù)據(jù)解碼回來(lái)。

加密Cookie 數(shù)據(jù)

每當(dāng)將數(shù)據(jù)存儲(chǔ)在Cookie中時(shí),請(qǐng)始終盡量減少存儲(chǔ)在Cookie中的敏感數(shù)據(jù)量。不要存儲(chǔ)用戶密碼之類的東西,并確保任何編碼數(shù)據(jù)也沒有此信息。在某些情況下,開發(fā)人員在不知不覺中將敏感數(shù)據(jù)存儲(chǔ)在Cookie或JWT中,因?yàn)樗鼈兪莃ase64編碼的,但實(shí)際上任何人都可以解碼該數(shù)據(jù)。它已編碼,未加密。

這是一個(gè)很大的錯(cuò)誤,因此,如果你擔(dān)心意外存儲(chǔ)敏感內(nèi)容,建議 你使用gorilla/securecookie之類的軟件包。

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

要使用該軟件包加密Cookie,只需在創(chuàng)建SecureCookie實(shí)例時(shí)傳入一個(gè)blockKey即可。

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

var hashKey = securecookie.GenerateRandomKey(64)
var blockKey = securecookie.GenerateRandomKey(32)
var s = securecookie.New(hashKey, blockKey)

總結(jié)

今天的文章除了闡述如何使用Go語(yǔ)言安全地傳輸Cookie數(shù)據(jù)外,再次格外強(qiáng)調(diào)一遍,編碼和加密的不同,從數(shù)據(jù)可讀性上看,兩者差不多,但本質(zhì)上是完全不一樣的:

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

我們?cè)谧鰯?shù)據(jù)傳輸時(shí)一定要記住兩者的區(qū)別,某種意義上,我覺得記住這兩點(diǎn)的區(qū)別比你學(xué)會(huì)今天文章里怎么安全傳輸Cookie更重要。

到此這篇關(guān)于Go語(yǔ)言中如何確保Cookie數(shù)據(jù)的安全傳輸?shù)奈恼戮徒榻B到這了,更多相關(guān)Go Cookie數(shù)據(jù)傳輸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • ubuntu下搭建Go語(yǔ)言(golang)環(huán)境

    ubuntu下搭建Go語(yǔ)言(golang)環(huán)境

    這篇文章主要介紹了ubuntu下搭建Go語(yǔ)言(golang)環(huán)境,需要的朋友可以參考下
    2015-01-01
  • Go語(yǔ)言O(shè)RM包中使用worm構(gòu)造查詢條件的實(shí)例詳解

    Go語(yǔ)言O(shè)RM包中使用worm構(gòu)造查詢條件的實(shí)例詳解

    worm是一款方便易用的Go語(yǔ)言O(shè)RM庫(kù)。worm支Model方式(持結(jié)構(gòu)體字段映射)、原生SQL以及SQLBuilder三種模式來(lái)操作數(shù)據(jù)庫(kù),并且Model方式、原生SQL以及SQLBuilder可混合使用,本文通過(guò)一些例子來(lái)說(shuō)明如何使用worm來(lái)構(gòu)造查詢條件,感興趣的朋友一起看看吧
    2022-07-07
  • Go打包附件內(nèi)容到執(zhí)行文件的方法

    Go打包附件內(nèi)容到執(zhí)行文件的方法

    處于種種原因, 我們不希望這部分額外的內(nèi)容以附件的形式出現(xiàn), 有沒有什么辦法能夠?qū)⒏郊?nèi)容直接打包進(jìn)可執(zhí)行文件中呢,下面小編給大家介紹下Go打包附件內(nèi)容到執(zhí)行文件的方法,感興趣的朋友一起看看吧
    2023-03-03
  • golang解析yaml文件操作

    golang解析yaml文件操作

    這篇文章主要介紹了golang解析yaml文件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • GO語(yǔ)言異常處理機(jī)制panic和recover分析

    GO語(yǔ)言異常處理機(jī)制panic和recover分析

    這篇文章主要介紹了GO語(yǔ)言異常處理機(jī)制panic和recover,分析了捕獲運(yùn)行時(shí)發(fā)生錯(cuò)誤的方法,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12
  • golang特有程序結(jié)構(gòu)入門教程

    golang特有程序結(jié)構(gòu)入門教程

    GO語(yǔ)言是一門不錯(cuò)的編程語(yǔ)言能夠到達(dá)靜態(tài)編譯語(yǔ)言的安全和性能,在本文中重點(diǎn)給大家介紹goland特有程序結(jié)構(gòu)及引用類型別名的特征,感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • Golang必知必會(huì)之Go?Mod命令詳解

    Golang必知必會(huì)之Go?Mod命令詳解

    go mod可以使項(xiàng)目從GOPATH的強(qiáng)制依賴中獨(dú)立出來(lái),也就是說(shuō)你的項(xiàng)目依賴不再需要放在在GOPATH下面了,下面這篇文章主要給大家介紹了關(guān)于Golang必知必會(huì)之Go?Mod命令的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 詳解Go語(yǔ)言中調(diào)度器的原理與使用

    詳解Go語(yǔ)言中調(diào)度器的原理與使用

    這篇文章主要介紹了Go語(yǔ)言運(yùn)行時(shí)調(diào)度器的實(shí)現(xiàn)原理,其中包含調(diào)度器的設(shè)計(jì)與實(shí)現(xiàn)原理、演變過(guò)程以及與運(yùn)行時(shí)調(diào)度相關(guān)的數(shù)據(jù)結(jié)構(gòu),希望對(duì)大家有所幫助
    2023-07-07
  • GO中Json解析的幾種方式

    GO中Json解析的幾種方式

    本文主要介紹了GO中Json解析的幾種方式,詳細(xì)的介紹了幾種方法,?文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • golang之tcp自動(dòng)重連實(shí)現(xiàn)方法

    golang之tcp自動(dòng)重連實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇golang之tcp自動(dòng)重連實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06

最新評(píng)論

甘洛县| 乌什县| 应城市| 寿阳县| 盱眙县| 南昌县| 呼伦贝尔市| 新余市| 绩溪县| 敖汉旗| 固原市| 曲麻莱县| 青冈县| 化隆| 威远县| 资兴市| 博白县| 固原市| 曲麻莱县| 华池县| 桃园市| 佛冈县| 小金县| 吐鲁番市| 桃江县| 陈巴尔虎旗| 禹州市| 无为县| 札达县| 浪卡子县| 武平县| 久治县| 许昌县| 石棉县| 临城县| 莫力| 微山县| 葵青区| 措美县| 凌源市| 沁阳市|