欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go web 預(yù)防跨站腳本的實(shí)現(xiàn)方式

 更新時(shí)間:2021年06月10日 15:03:05   作者:chengqiuming  
這篇文章主要介紹了go web 預(yù)防跨站腳本的實(shí)現(xiàn)方式,文中給大家介紹XSS最佳的防護(hù)應(yīng)該注意哪些問(wèn)題,本文通過(guò)實(shí)例代碼講解的非常詳細(xì),需要的朋友可以參考下

一 點(diǎn)睛

現(xiàn)在的網(wǎng)站包含大量的動(dòng)態(tài)內(nèi)容以提高用戶體驗(yàn),比過(guò)去要復(fù)雜得多。所謂動(dòng)態(tài)內(nèi)容,就是根據(jù)用戶環(huán)境和需要,Web 應(yīng)用程序能夠輸出相應(yīng)的內(nèi)容。動(dòng)態(tài)站點(diǎn)會(huì)受到一種名為“跨站腳本攻擊”(Cross Site Scripting, 安全專家們通常將其縮寫成 XSS)的威脅,而靜態(tài)站點(diǎn)則完全不受其影響。

攻擊者通常會(huì)在有漏洞的程序中插入 JavaScript、VBScript、 ActiveX 或 Flash 以欺騙用戶。一旦得手,他們可以盜取用戶帳戶信息,修改用戶設(shè)置,盜取或污染 cookie 和植入惡意廣告等。

對(duì) XSS 最佳的防護(hù)應(yīng)該結(jié)合以下兩種方式。

1 驗(yàn)證所有輸入數(shù)據(jù),有效檢測(cè)攻擊。

2 對(duì)所有輸出數(shù)據(jù)進(jìn)行適當(dāng)?shù)奶幚?,以防止任何已成功注入的腳本在瀏覽器端運(yùn)行。

針對(duì)第2種方式,Go 是怎樣預(yù)防的呢?Go 的 html/template 包中帶有下面幾個(gè)函數(shù)可以幫助轉(zhuǎn)義。

func HTMLEscape(w io.Writer, b []byte) // 把 b 進(jìn)行轉(zhuǎn)義之后寫到 w

func HTMLEscapeString(s string) string // 轉(zhuǎn)義 s 之后返回結(jié)果字符串

func HTMLEscaper(args ...interface{}) string // 支持多個(gè)參數(shù)一起轉(zhuǎn)義,返回結(jié)果字符串

二 先看一個(gè)轉(zhuǎn)義的例子

 1 代碼

package main
 
import (
   "fmt"
   "html/template"
   "log"
   "net/http"
)
 
// 登錄邏輯
func login(w http.ResponseWriter, r *http.Request) {
   fmt.Println("method:", r.Method) // 獲取請(qǐng)求的方法
   if r.Method == "GET" {
      t, _ := template.ParseFiles("src\\goweb\\demo3\\login.html") // 解析模板
      t.Execute(w, nil)                                            // 渲染模板,并發(fā)送給前端
   } else {
      // 請(qǐng)求的是登陸數(shù)據(jù),那么執(zhí)行登陸的邏輯判斷
      // 解析表單
      r.ParseForm()
      fmt.Println("username:", r.Form["username"])
      fmt.Println("password:", r.Form["password"])
      template.HTMLEscape(w, []byte(r.Form.Get("username"))) //輸出到客戶端
   }
}
 
func main() {
   http.HandleFunc("/login", login)         // 設(shè)置訪問(wèn)的路由
   err := http.ListenAndServe(":9090", nil) // 設(shè)置監(jiān)聽(tīng)的端口
   if err != nil {
      log.Fatal("ListenAndServe: ", err)
   }
}

2 測(cè)試

如果在瀏覽器輸入的 username 是 <script>alert()</script>,在瀏覽器上將看到下面內(nèi)容。

3 說(shuō)明

Go 的 html/template 包默認(rèn)幫忙過(guò)濾了 html 標(biāo)簽,將其進(jìn)行了轉(zhuǎn)義。

4 問(wèn)題引出

如果要正常輸出<script>alert()</script>,怎樣處理呢?text/template 可以幫忙進(jìn)行處理。

三 使用 text/template 進(jìn)行處理

1 代碼

package main
 
import (
   "log"
   "net/http"
   "text/template"
)
 
// 轉(zhuǎn)義測(cè)試
func escape(w http.ResponseWriter, r *http.Request) {
   // 正常顯示
   t, _ := template.New("foo").Parse(`{{define "T"}}Hello1, {{.}}!{{end}}`)
   t.ExecuteTemplate(w, "T", "<script>alert('you have been pwned')</script>")
}
 
func main() {
   http.HandleFunc("/escape", escape)       // 設(shè)置轉(zhuǎn)義
   err := http.ListenAndServe(":9090", nil) // 設(shè)置監(jiān)聽(tīng)的端口
   if err != nil {
      log.Fatal("ListenAndServe: ", err)
   }
}

2 測(cè)試

3 說(shuō)明

當(dāng)使用 text/template 這個(gè)包時(shí),可以正常顯示。

四 使用 html/template 進(jìn)行處理

1 代碼

package main
 
import (
   "html/template"
   "log"
   "net/http"
)
 
// 轉(zhuǎn)義測(cè)試
func escape(w http.ResponseWriter, r *http.Request) {
   // 轉(zhuǎn)義顯示
   t, _ := template.New("foo").Parse(`{{define "T"}}Hello1, {{.}}!{{end}}`)
   t.ExecuteTemplate(w, "T", "<script>alert('you have been pwned')</script>")
    // 正常顯示
   t, _ = template.New("foo").Parse(`{{define "T"}}Hello2, {{.}}!{{end}}`)
   t.ExecuteTemplate(w, "T", template.HTML("<script>alert('you have been pwned')</script>"))
}
 
func main() {
   http.HandleFunc("/escape", escape)       // 設(shè)置轉(zhuǎn)義
   err := http.ListenAndServe(":9090", nil) // 設(shè)置監(jiān)聽(tīng)的端口
   if err != nil {
      log.Fatal("ListenAndServe: ", err)
   }
}

2 測(cè)試結(jié)果

3 說(shuō)明

當(dāng)使用 html/template 這個(gè)包時(shí),如果使用 template.HTML 函數(shù),也可以正常顯示,不使用 template.HTML 函數(shù),轉(zhuǎn)義顯示。

以上就是go web 預(yù)防跨站腳本的詳細(xì)內(nèi)容,更多關(guān)于go web 預(yù)防跨站的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語(yǔ)言實(shí)現(xiàn)MapReduce的示例代碼

    Go語(yǔ)言實(shí)現(xiàn)MapReduce的示例代碼

    MapReduce是一種備受歡迎的編程模型,它最初由Google開(kāi)發(fā),用于并行處理大規(guī)模數(shù)據(jù)以提取有價(jià)值的信息,本文將使用GO語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的MapReduce,需要的可以參考下
    2023-10-10
  • 詳解Golang中結(jié)構(gòu)體方法的高級(jí)應(yīng)用

    詳解Golang中結(jié)構(gòu)體方法的高級(jí)應(yīng)用

    本文旨在深度剖析Go中結(jié)構(gòu)體方法的高級(jí)應(yīng)用。我們不僅會(huì)回顧結(jié)構(gòu)體方法的基本概念和用法,還將探討如何通過(guò)高級(jí)技巧和最佳實(shí)踐,希望對(duì)大家有所幫助
    2024-01-01
  • Golang 日期/時(shí)間包的使用詳解

    Golang 日期/時(shí)間包的使用詳解

    這篇文章主要介紹了Golang 日期/時(shí)間包的使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • 一文完全掌握 Go math/rand(源碼解析)

    一文完全掌握 Go math/rand(源碼解析)

    這篇文章主要介紹了一文完全掌握 Go math/rand(源碼解析),本文可以幫助大家快速使用Go Rand.,感興趣的朋友跟隨小編一起看看吧
    2021-04-04
  • go實(shí)現(xiàn)fping功能

    go實(shí)現(xiàn)fping功能

    這篇文章主要介紹了go實(shí)現(xiàn)fping功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Go依賴注入工具wire的具體使用

    Go依賴注入工具wire的具體使用

    本文主要介紹了Go依賴注入工具wire的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Golang依賴注入工具digo的使用詳解

    Golang依賴注入工具digo的使用詳解

    這篇文章主要為大家詳細(xì)介紹了Golang中依賴注入工具digo的使用,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • 詳解Go?flag實(shí)現(xiàn)二級(jí)子命令的方法

    詳解Go?flag實(shí)現(xiàn)二級(jí)子命令的方法

    這篇文章主要介紹了Go?flag?詳解,實(shí)現(xiàn)二級(jí)子命令,本文就探討一下?Go?語(yǔ)言中如何寫一個(gè)擁有類似特性的命令行程序,需要的朋友可以參考下
    2022-07-07
  • Go 驗(yàn)證字符串中是否包含中文(推薦)

    Go 驗(yàn)證字符串中是否包含中文(推薦)

    這篇文章主要介紹了Go 驗(yàn)證字符串中是否包含中文,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Go初學(xué)者踩坑之go?mod?init與自定義包的使用

    Go初學(xué)者踩坑之go?mod?init與自定義包的使用

    go?mod是go的一個(gè)模塊管理工具,用來(lái)代替?zhèn)鹘y(tǒng)的GOPATH方案,下面這篇文章主要給大家介紹了關(guān)于Go初學(xué)者踩坑之go?mod?init與自定義包的使用,需要的朋友可以參考下
    2022-10-10

最新評(píng)論