Защита XSS с помощью golang

# #go

Вопрос:

Я следую этому уроку для golang.

Я действительно не понимаю, куда мне следует поместить этот код внутри моего кода

 t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")
 

следующее-мое главное.иди

 package main

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

func sayhelloName(w http.ResponseWriter, r *http.Request) {
    r.ParseForm() //Parse url parameters passed, then parse the response packet for the POST body (request body)
    // attention: If you do not call ParseForm method, the following data can not be obtained form
    fmt.Println(r.Form) // print information on server side.
    fmt.Println("path", r.URL.Path)
    fmt.Println("scheme", r.URL.Scheme)
    fmt.Println(r.Form["url_long"])
    for k, v := range r.Form {
        fmt.Println("key:", k)
        fmt.Println("val:", strings.Join(v, ""))
    }
    fmt.Fprintf(w, "Hello astaxie!") // write data to response
}

func login(w http.ResponseWriter, r *http.Request) {
    fmt.Println("method:", r.Method) //get request method
    if r.Method == "GET" {
        t, _ := template.ParseFiles("login.gtpl")
        t.Execute(w, nil)
    } else {
        r.ParseForm()
        // logic part of log in
        fmt.Println("username:", r.Form["username"])
        fmt.Println("password:", r.Form["password"])
        
        //I put the sample code here
        t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
        err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")
    }
}

func main() {
    http.HandleFunc("/", sayhelloName) // setting router rule
    http.HandleFunc("/login", login)
    err := http.ListenAndServe(":9090", nil) // setting listening port
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}
 

После того, как я ввел пример кода в func login и скомпилировал, он хочет «выйти» неопределенным в этой строке

 err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")
 

Кто-нибудь может помочь мне разобраться в проблеме?
Спасибо

Ответ №1:

Вы должны записать выходные данные в средство записи ответов:

 err = t.ExecuteTemplate(w, "T", "<script>alert('you have been pwned')</script>")