在我的Golang代码中,CSRF使用NoSurf.这是来自Trevor Sawler的Golang课程,第8.2节.如果有什么不同的话,我决定用Bootstrap 5代替教程的Bootstrap 4.我的代码可以在here中找到.要激活Web服务器,我使用go run ./cmd/web/*.go.因此,在cmd\web\routes.go中,localhost:8080/search-availability页提供了以下内容:

mux.Get("/search-availability", handlers.Repo.Availability)
mux.Post("/search-availability", handlers.Repo.AvailabilityPost)

pkg\handlers\handlers.go人中,我有:

func (m *Repository) Availability(w http.ResponseWriter, r *http.Request) {
    log.Println("Availability")
    render.RenderTemplate(w, r, "search-availability.page.tmpl", &models.TemplateData{})
}

func (m *Repository) AvailabilityPost(w http.ResponseWriter, r *http.Request) {
    log.Println("Before Write")
    w.Write([]byte("Posted to search-availability"))
    log.Println("After Write")
}

pkg\render\render.go人中,我有:

func AddDefaultData(td *models.TemplateData, r *http.Request) *models.TemplateData {
    td.CsrfToken = nosurf.Token(r)
    return td
}

pkg\models\templatedata.go人中,我有:

type TemplateData struct {
    StringMap map[string]string
    IntMap    map[string]int
    FloatMap  map[string]float64
    Data      map[string]interface{}
    CsrfToken string
    Flash     string
    Error     string
}

templates\search-availability.page.tmpl内,我在第13行有:

<input type="text" name="csrf_token" value="{{.CsrfToken}}">

localhost:8080/search-availability页面中 Select 开始和结束日期后,单击Search Availability按钮总是会得到400 Bad Request,如下所示.

img

从终端上,我可以看到代码从未输入AvailabilityPost:

2023/03/12 19:06:48 Hit the page
2023/03/12 19:06:48 Availability
2023/03/12 19:06:51 Hit the page

但是,如果我这样禁用cmd\web\routes.go内部的nosurf:

func routes(app *config.AppConfig) http.Handler {
    mux := chi.NewRouter()
    mux.Use(middleware.Recoverer)
    mux.Use(WriteToConsole)
    // mux.Use(NoSurf)
    mux.Use(SessionLoad)
    ...
    mux.Get("/search-availability", handlers.Repo.Availability)
    mux.Post("/search-availability", handlers.Repo.AvailabilityPost)
    ...

    fileServer := http.FileServer(http.Dir("./static/"))
    mux.Handle("/static/*", http.StripPrefix("/static", fileServer))
    return mux
}

浏览器显示一条成功的帖子:

Posted to search-availability

终端还确认:

2023/03/12 19:19:46 Hit the page
2023/03/12 19:19:46 Availability
2023/03/12 19:19:48 Hit the page
2023/03/12 19:19:48 Before Write
2023/03/12 19:19:48 After Write

谁能指出我做错了什么?我没有像教程中看到的那样得到一个成功的帖子.这些material 有点过时了,但我看不出这有什么问题.

推荐答案

您没有在表单提交时发送CSRF令牌输入. 要解决这个问题,可以将表单属性添加到CSRF输入元素并将其设置为表单的ID(日期 Select 器),或者将CSRF输入元素移动到表单元素中.

Go相关问答推荐

Golang Cososdb-gremlin连接

Go程序在并发Forking 循环中停留在syscall.Wait4

golang 的通用 map 功能

Go GORM创建表,但不创建列

如何预编译Golang标准库?

困扰围棋官方巡回赛的S建议所有方法都使用同一类型的接收器

Docker Compose Health Check未退出,错误为无法启动

Golang Fiber Render - 将数据发送到多个布局

是否可以使用标准库构建 Go 二进制文件?

是否需要手动调用rand.Seed?

使用 OpenTelemetry 统一不同服务的范围

我应该先解锁然后再广播吗?

如何从 Go Lambda 函数返回 HTML?

如何使用泛型将接口转换为指定类型

类型/ struct 函数的 GoDoc 示例函数

在嵌套模板中使用变量,它也被定义为 go 模板中的变量?

使用innerxml在 Go 中编码 XML 是否仅适用于某些类型?

NaN 是 golang 中的可比类型吗?

Golang LinkedList 删除第一个元素

为什么 Go 不允许将一个泛型分配给另一个泛型?