- HandleManageUI übergibt CSRFToken korrekt ans Template (leeres Hidden-Field blockierte JS-Inject-Snippet) - HandleTenantDashboard setzt CSRF-Cookie und befüllt CSRFToken in Template-Daten - tenant/csrf_helpers.go: setCSRFCookie im tenant-Package (Import-Cycle-Isolation) - Logout-Formular in tenantDashTmpl hat jetzt statisches CSRF-Hidden-Field - Doku: POST /logout und POST /login mit CSRF-Anforderungen dokumentiert Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
31 lines
693 B
Go
31 lines
693 B
Go
package tenant
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/hex"
|
|
"net/http"
|
|
)
|
|
|
|
const csrfCookieName = "morz_csrf"
|
|
|
|
// setCSRFCookie setzt (oder erneuert) den CSRF-Cookie und gibt das Token zurück.
|
|
func setCSRFCookie(w http.ResponseWriter, r *http.Request, devMode bool) string {
|
|
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,
|
|
Secure: !devMode,
|
|
SameSite: http.SameSiteLaxMode,
|
|
MaxAge: 8 * 3600,
|
|
})
|
|
return token
|
|
}
|