fix(csrf): CSRF-Token in Login-Fehlerseite fehlt — macht Retry-Versuch unmöglich

HandleLoginPost renderte Fehlerseiten (falsches Passwort, leere Felder) ohne
CSRFToken in den Template-Daten. Das hidden field <csrf_token> war leer, sodass
jeder weitere Submit-Versuch mit "Ungültiger CSRF-Token" scheiterte.

Fix: setCSRFCookie am Anfang des Handlers aufrufen und das Token in allen
renderError-Pfaden an das Template übergeben.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jesko Anschütz 2026-03-23 22:22:58 +01:00
parent 8e0501a012
commit 73c3d74098

View file

@ -76,13 +76,18 @@ func HandleLoginUI(authStore *store.AuthStore, screenStore *store.ScreenStore, c
func HandleLoginPost(authStore *store.AuthStore, screenStore *store.ScreenStore, cfg config.Config) http.HandlerFunc { func HandleLoginPost(authStore *store.AuthStore, screenStore *store.ScreenStore, cfg config.Config) http.HandlerFunc {
tmpl := template.Must(template.New("login").Parse(loginTmpl)) tmpl := template.Must(template.New("login").Parse(loginTmpl))
return func(w http.ResponseWriter, r *http.Request) {
// K1: CSRF-Cookie erneuern und Token für Fehler-Re-Rendering bereitstellen.
// Das Token muss auch bei Fehlerantworten im Hidden-Field stehen, damit
// der nächste Submit-Versuch den CSRF-Check besteht.
csrfToken := setCSRFCookie(w, r, cfg.DevMode)
renderError := func(w http.ResponseWriter, next, msg string) { renderError := func(w http.ResponseWriter, next, msg string) {
w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.WriteHeader(http.StatusUnauthorized) w.WriteHeader(http.StatusUnauthorized)
_ = tmpl.Execute(w, loginData{Error: msg, Next: next}) _ = tmpl.Execute(w, loginData{Error: msg, Next: next, CSRFToken: csrfToken})
} }
return func(w http.ResponseWriter, r *http.Request) {
if err := r.ParseForm(); err != nil { if err := r.ParseForm(); err != nil {
renderError(w, "", "Ungültige Anfrage.") renderError(w, "", "Ungültige Anfrage.")
return return