GO—-预防跨站脚本

现在的网站包含大量的动态内容以提高用户体验,比过去要复杂得多。攻击者通常会在有漏洞的程序中插入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
cartoon porn
此条目发表在 网站开发 分类目录,贴了 标签。将固定链接加入收藏夹。

评论功能已关闭。