zoukankan      html  css  js  c++  java
  • 使用go搭建一个简单的web服务器(4)预防跨站脚本

    1.登陆页面

    <html>
    <head>
    <title>login</title>
    </head>
    <body>
    <form action="http://127.0.0.1:9090/login" method="post">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    <input type="submit" value="登陆">
    </form>
    </body>
    </html>

    2.后端处理逻辑

    package main
    
    import (
        "fmt"
        "html/template"
        "log"
        "net/http"
        "strings"
        text_template "text/template"
    )
    
    func sayhelloname(w http.ResponseWriter, r *http.Request) {
        r.ParseForm() //解析参数,默认是不会解析的。
        fmt.Println(r.Form)
        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("value:", strings.Join(v, ","))
        }
        fmt.Fprintf(w, "hello, welcome you!") //这个字符串写入到w中,用于返回给客户端。
    }
    func login(w http.ResponseWriter, r *http.Request) {
        fmt.Println("method: ", r.Method)
        if r.Method == "GET" {
            t, _ := template.ParseFiles("login.html")
            t.Execute(w, nil)
        } else {
            r.ParseForm()
            //预防跨站脚本攻击
            way := 3
            if way == 1 {
                //将html标签进行转义
                fmt.Println("方法一")
                fmt.Println("username: ", template.HTMLEscapeString(r.Form.Get("username")))
                fmt.Println("password: ", template.HTMLEscapeString(r.Form.Get("password")))
                template.HTMLEscape(w, []byte(r.Form.Get("username"))) //将转义后的用户名字段发送给客户端
            } else if way == 2 {
                //将html标签进行转义
                fmt.Println("方法二")
                t, err := template.New("foo").Parse(`{{define "T"}}Hello,{{.}}!{{end}}`)
                err = t.ExecuteTemplate(w, "T", "<script>alert('you have been login')</script>") //将一段含有脚本的内容发送给客户端
                if err != nil {
                    fmt.Println(err)
                }
            } else if way == 3 {
                //在编辑文章时,有时候就想在文章中加入带有html标签的代码来作为示例,那么就不能使用上面的方法进行转义。
                fmt.Println("方法三")
                t, err := template.New("foo").Parse(`{{define "T"}}Hello,{{.}}!{{end}}`)
                err = t.ExecuteTemplate(w, "T", template.HTML("<script>alert('you have been login')</script>")) //将一段含有脚本的内容发送给客户端
                if err != nil {
                    fmt.Println(err)
                }
            } else {
                //在编辑文章时,有时候就想在文章中加入带有html标签的代码来作为示例,那么就不能使用上面的方法进行转义。
                fmt.Println("方法四")
                t, err := text_template.New("foo").Parse(`{{define "T"}}Hello,{{.}}!{{end}}`)
                err = t.ExecuteTemplate(w, "T", "<script>alert('you have been login')</script>") //将一段含有脚本的内容发送给客户端
                if err != nil {
                    fmt.Println(err)
                }
            }
    
        }
    }
    func main() {
        http.HandleFunc("/", sayhelloname)       //设置访问的路由
        http.HandleFunc("/login", login)         //设置访问的路由
        err := http.ListenAndServe(":9090", nil) //设置监听的端口
        if err != nil {
            log.Fatal("ListenAndServe: ", err)
        }
    }
    人生短,迷茫路一程又一程。 脚步重,雨雪天踟蹰也踟蹰。 滴水聚,久无成效伊人不见。 该如何,敲击敲击昼夜不停。
  • 相关阅读:
    js正则表达式大全(2)
    Magic Trackpad 2 on win10 x64
    Google 日历短信通知没有了
    Ueditor 1.4.3 jsp utf-8版Bug修复
    [转]eclipse中build workspace的相关优化
    Hello,
    EpCloud开发日志
    为服务创建安装程序
    winform 通过WCF上传Dataset数据
    opcrcw.da.dll 和.net 4.0
  • 原文地址:https://www.cnblogs.com/DesignerA/p/11558692.html
Copyright © 2011-2022 走看看