package manage // csrf_helpers.go — Hilfsfunktionen für CSRF im manage-Package (K1). // // Das manage-Package darf httpapi nicht importieren (würde einen Import-Cycle erzeugen). // Deshalb sind die minimalen CSRF-Hilfsfunktionen hier dupliziert. // Die eigentliche CSRF-Middleware lebt in httpapi/csrf.go. import ( "crypto/rand" "encoding/hex" "net/http" ) const ( csrfCookieName = "morz_csrf" // CSRFFieldName ist der Name des versteckten Form-Felds mit dem CSRF-Token. // Wird in Templates als {{.CSRFToken}} eingebettet. CSRFFieldName = "csrf_token" ) // setCSRFCookie setzt (oder erneuert) den CSRF-Cookie und gibt das Token zurück. // Wird von Handlern aufgerufen, die GET-Seiten mit Formularen rendern. func setCSRFCookie(w http.ResponseWriter, r *http.Request, devMode bool) string { // Existierendes Token wiederverwenden. if c, err := r.Cookie(csrfCookieName); err == nil && c.Value != "" { return c.Value } buf := make([]byte, 32) if _, err := rand.Read(buf); err != nil { return "" } token := hex.EncodeToString(buf) http.SetCookie(w, &http.Cookie{ Name: csrfCookieName, Value: token, Path: "/", HttpOnly: false, // muss von JS nicht gelesen werden; Formulare nutzen das versteckte Feld Secure: !devMode, SameSite: http.SameSiteLaxMode, MaxAge: 8 * 3600, // 8h }) return token }