Golang - POST失败(NoSurf CSRF)

yjghlzjz  于 2023-03-21  发布在  Go
关注(0)|答案(1)|浏览(134)

我在我的Golang代码中使用NoSurf作为CSRF。这是特雷弗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页面选择开始和结束日期后,单击Search Availability按钮总是得到400 Bad Request,如下所示。

从终端可以看到,代码从未输入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

有人能指出我做错了什么吗?我没有像教程中看到的那样得到一个成功的帖子。材料有点过时,但我看不出这是一个问题。

kkbh8khc

kkbh8khc1#

未在表单提交时发送CSRF令牌输入。若要解决此问题,可以将form属性添加到CSRF input元素并将其设置为表单的ID(日期选取器),或者将CSRF input元素移动到form元素内。

相关问题