中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go中如何實現web預防跨站腳本

發布時間:2021-06-11 09:54:08 來源:億速云 閱讀:143 作者:小新 欄目:開發技術

這篇文章主要介紹了go中如何實現web預防跨站腳本,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一 點睛

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

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

對 XSS 最佳的防護應該結合以下兩種方式。

1 驗證所有輸入數據,有效檢測攻擊。

2 對所有輸出數據進行適當的處理,以防止任何已成功注入的腳本在瀏覽器端運行。

針對第2種方式,Go 是怎樣預防的呢?Go 的 html/template 包中帶有下面幾個函數可以幫助轉義。

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

func HTMLEscapeString(s string) string // 轉義 s 之后返回結果字符串

func HTMLEscaper(args ...interface{}) string // 支持多個參數一起轉義,返回結果字符串

二 先看一個轉義的例子

 1 代碼

package main
 
import (
   "fmt"
   "html/template"
   "log"
   "net/http"
)
 
// 登錄邏輯
func login(w http.ResponseWriter, r *http.Request) {
   fmt.Println("method:", r.Method) // 獲取請求的方法
   if r.Method == "GET" {
      t, _ := template.ParseFiles("src\\goweb\\demo3\\login.html") // 解析模板
      t.Execute(w, nil)                                            // 渲染模板,并發送給前端
   } else {
      // 請求的是登陸數據,那么執行登陸的邏輯判斷
      // 解析表單
      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)         // 設置訪問的路由
   err := http.ListenAndServe(":9090", nil) // 設置監聽的端口
   if err != nil {
      log.Fatal("ListenAndServe: ", err)
   }
}

2 測試

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

go中如何實現web預防跨站腳本

3 說明

Go 的 html/template 包默認幫忙過濾了 html 標簽,將其進行了轉義。

4 問題引出

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

三 使用 text/template 進行處理

1 代碼

package main
 
import (
   "log"
   "net/http"
   "text/template"
)
 
// 轉義測試
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)       // 設置轉義
   err := http.ListenAndServe(":9090", nil) // 設置監聽的端口
   if err != nil {
      log.Fatal("ListenAndServe: ", err)
   }
}

2 測試

go中如何實現web預防跨站腳本

3 說明

當使用 text/template 這個包時,可以正常顯示。

四 使用 html/template 進行處理

1 代碼

package main
 
import (
   "html/template"
   "log"
   "net/http"
)
 
// 轉義測試
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>")
    // 正常顯示
   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)       // 設置轉義
   err := http.ListenAndServe(":9090", nil) // 設置監聽的端口
   if err != nil {
      log.Fatal("ListenAndServe: ", err)
   }
}

2 測試結果

go中如何實現web預防跨站腳本

3 說明

當使用 html/template 這個包時,如果使用 template.HTML 函數,也可以正常顯示,不使用 template.HTML 函數,轉義顯示。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“go中如何實現web預防跨站腳本”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

敦煌市| 望都县| 梅河口市| 克东县| 依安县| 丰台区| 嵊州市| 方正县| 阳曲县| 应用必备| 武清区| 江达县| 曲靖市| 罗田县| 五原县| 阳春市| 乌鲁木齐市| 油尖旺区| 双柏县| 温州市| 海阳市| 枝江市| 翁牛特旗| 昭觉县| 大连市| 包头市| 南平市| 湖北省| 安阳县| 邹城市| 察雅县| 常德市| 绍兴县| 泰兴市| 桦川县| 东宁县| 乌鲁木齐市| 曲麻莱县| 博乐市| 郸城县| 宁夏|