现在的网站包含大量的动态内容以提高用户体验,比过去要复杂得多。攻击者通常会在有漏洞的程序中插入JavaScript以欺骗用户。一旦得手,他们可以盗取用户帐户信息,修改用户设置,盗取/污染cookie和植入恶意广告等。
对XSS最佳的防护应该结合以下两种方法:一是验证所有输入数据,有效检测攻击(这个我们前面小节已经有过介绍);另一个是对所有输出数据进行适当的处理,以防止任何已成功注入的脚本在浏览器端运行。
那么Go里面是怎么做这个有效防护的呢?Go的html/template里面带有下面几个函数可以帮你转义
- func HTMLEscape(w io.Writer, b []byte) //把b进行转义之后写到w
- func HTMLEscapeString(s string) string //转义s之后返回结果字符串
- func HTMLEscaper(args …interface{}) string //支持多个参数一起转义,返回结果字符串
GO代码
package main import ( "fmt" "html/template" "log" "net/http" ) func saygo(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { t, _ := template.ParseFiles("form.html") t.Execute(w, nil) } else { w.Header().Set("Content-Type", "text/html;charset=utf-8") r.ParseForm() //username := r.Form.Get("username") username := template.HTMLEscapeString(r.Form.Get("username")) fmt.Fprintf(w, username) fmt.Fprintf(w, "<br/>") t, _ := template.ParseFiles("form.html") t.Execute(w, nil) } } func main() { http.HandleFunc("/", saygo) err := http.ListenAndServe(":9090", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } }
模板文件:
<html> <head> <title>预防跨站脚本</title> </head> <body> <form action="" method="post"> 输入:<input type="text" value="<script>alert('攻击')</script>" name="username"><br/> <input type="submit" value="提交"> </form> </body> </html>
通过示例,你就可以明白GO是怎么处理转义安全的.
I have some cellulite and no shortage of scars
gay porn Natalie Getz Looks Hot in ICE
monster box collection 1
miranda lambert weight lossEntertainer tops herself again at Grammy Awards Show photo Show
miranda lambert weight lossEntertainer tops herself again at Grammy Awards Show photo Show