golang web xss攻撃予防

3158 ワード

ここに私が書いた簡単なユーザーパラメータデータをページに表示します.
package main

import (
	"fmt"
	"log"
	"net/http"
)

func main() {
	//         /      Handler       
	http.HandleFunc("/", Handler)
	http.ListenAndServe(":8080", nil)
}

func Handler(w http.ResponseWriter, req *http.Request) {
	err := req.ParseForm()
	//                     
	if err != nil {
		log.Fatal(nil)
	}
	//      name   
	user_pro := req.FormValue("name")

	//                
	fmt.Fprintf(w, "%s", user_pro)

}
上のコードは私がここに書いたデータが処理されていないので、効果を見てみましょう.
golang web xss攻击预防_第1张图片
こちらから渡された正常なパラメータデータはこちらに問題はありません
次にxssスクリプトを渡してみましょう
golang web xss攻击预防_第2张图片
対応するページにalertのデータがポップアップされているのがわかります
つまり今私たちがこのようにコードを書くとxssによって攻撃操作を行うことができます.
どうやって予防するんだ?
golang内蔵ライブラリに対応する内蔵パッケージが用意されています
html/templateパッケージのhtmlをエスケープ
package main

import (
	"html/template"
	"log"
	"net/http"
)

func main() {
	//         /      Handler       
	http.HandleFunc("/", Handler)
	http.ListenAndServe(":8080", nil)
}

func Handler(w http.ResponseWriter, req *http.Request) {
	err := req.ParseForm()
	//                     
	if err != nil {
		log.Fatal(nil)
	}
	//      name   
	user_pro := req.FormValue("name")
	//      
	tpl, err := template.New("foo").Parse(`{{define "html_data"}}{{.}}{{end}}`)
	//                    
	if err != nil {
		log.Fatal(err)
	}
	err = tpl.ExecuteTemplate(w, "html_data", user_pro)
	//                  
	if err != nil {
		log.Fatal(err)
	}
}

実行効果
golang web xss攻击预防_第3张图片
上からアクセスした結果が見つかりました.こちらの<などの記号はhtml特殊文字に変換されています
上記の方法も簡略化できる
package main

import (
	"fmt"
	"html/template"
	"log"
	"net/http"
)

func main() {
	//         /      Handler       
	http.HandleFunc("/", Handler)
	http.ListenAndServe(":8080", nil)
}

func Handler(w http.ResponseWriter, req *http.Request) {
	err := req.ParseForm()
	//                     
	if err != nil {
		log.Fatal(nil)
	}
	//      name   
	user_pro := req.FormValue("name")
	fmt.Fprintf(w, "%s", xss_hander(user_pro))

}
func xss_hander(s string) string {
	return template.HTMLEscapeString(s)
}