我在我的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
有人能指出我做错了什么吗?我没有像教程中看到的那样得到一个成功的帖子。材料有点过时,但我看不出这是一个问题。
1条答案
按热度按时间kkbh8khc1#
未在表单提交时发送CSRF令牌输入。若要解决此问题,可以将form属性添加到CSRF input元素并将其设置为表单的ID(日期选取器),或者将CSRF input元素移动到form元素内。