golang web xss攻撃予防
3158 ワード
ここに私が書いた簡単なユーザーパラメータデータをページに表示します.
こちらから渡された正常なパラメータデータはこちらに問題はありません
次にxssスクリプトを渡してみましょう
対応するページにalertのデータがポップアップされているのがわかります
つまり今私たちがこのようにコードを書くとxssによって攻撃操作を行うことができます.
どうやって予防するんだ?
golang内蔵ライブラリに対応する内蔵パッケージが用意されています
html/templateパッケージのhtmlをエスケープ
実行効果
上からアクセスした結果が見つかりました.こちらの<などの記号はhtml特殊文字に変換されています
上記の方法も簡略化できる
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)
}
上のコードは私がここに書いたデータが処理されていないので、効果を見てみましょう.
こちらから渡された正常なパラメータデータはこちらに問題はありません
次にxssスクリプトを渡してみましょう

対応するページに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)
}
}
実行効果

上からアクセスした結果が見つかりました.こちらの<などの記号は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)
}