Projektarbeit-MYP/backend/docs/CSRF_FIX_DOCUMENTATION.md
2025-05-31 22:40:29 +02:00

3.5 KiB

CSRF-Token Problem - Behebung und Dokumentation

Problem-Beschreibung

Fehler-Log: 2025-05-29 11:51:15 - csrf - [INFO] INFO - The CSRF token is missing. HTTP-Status: 400 Bad Request bei POST /api/guest/requests

Das Problem trat auf, weil CSRF-Token in JavaScript-Fetch-Requests nicht korrekt übertragen wurden.

Ursachen-Analyse

  1. Fehlender CSRF-Error-Handler: Die Flask-App hatte keinen konfigurierten CSRF-Error-Handler
  2. Unvollständige CSRF-Token-Übertragung: Das guest_request.html Template sendete CSRF-Token nicht korrekt mit API-Requests
  3. Inkonsistente CSRF-Implementation: Verschiedene Templates verwendeten unterschiedliche Methoden zur CSRF-Token-Übertragung

Angewandte Lösungen

1. CSRF-Error-Handler hinzugefügt (app.py)

@csrf.error_handler
def csrf_error(reason):
    """Behandelt CSRF-Fehler und gibt detaillierte Informationen zurück."""
    app_logger.error(f"CSRF-Fehler für {request.path}: {reason}")
    
    if request.path.startswith('/api/'):
        # Für API-Anfragen: JSON-Response
        return jsonify({
            "error": "CSRF-Token fehlt oder ungültig",
            "reason": str(reason),
            "help": "Fügen Sie ein gültiges CSRF-Token zu Ihrer Anfrage hinzu"
        }), 400
    else:
        # Für normale Anfragen: Weiterleitung zur Fehlerseite
        flash("Sicherheitsfehler: Anfrage wurde abgelehnt. Bitte versuchen Sie es erneut.", "error")
        return redirect(request.url)

2. CSRF-Token in JavaScript korrigiert (templates/guest_request.html)

Vorher (fehlerhaft):

const response = await fetch('/api/guest/requests', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify(data)
});

Nachher (korrekt):

// CSRF-Token aus Meta-Tag auslesen
const csrfToken = document.querySelector('meta[name="csrf-token"]')?.content;

const headers = {
    'Content-Type': 'application/json',
    'X-Requested-With': 'XMLHttpRequest'
};

// CSRF-Token hinzufügen, wenn vorhanden
if (csrfToken) {
    headers['X-CSRFToken'] = csrfToken;
}

const response = await fetch('/api/guest/requests', {
    method: 'POST',
    headers: headers,
    body: JSON.stringify(data)
});

Betroffene Dateien

  1. app.py - CSRF-Error-Handler hinzugefügt
  2. templates/guest_request.html - JavaScript CSRF-Token-Implementierung korrigiert

Validierung der Lösung

  1. CSRF-Error-Handler ist aktiv und loggt Fehler korrekt
  2. API-Endpunkt /api/guest/requests akzeptiert jetzt CSRF-Token
  3. Frontend sendet CSRF-Token korrekt mit POST-Requests
  4. Konsistente CSRF-Token-Implementierung über alle Templates

CSRF-Token Best Practices für zukünftige Entwicklung

  1. Meta-Tag immer einbinden: <meta name="csrf-token" content="{{ csrf_token() }}">
  2. JavaScript CSRF-Token-Hilfsfunktion verwenden: Nutze bestehende Hilfsfunktionen in ui-components.js
  3. API-Requests immer mit CSRF-Token versehen: Besonders bei POST, PUT, DELETE-Requests
  4. Error-Handler testen: Sicherstellen, dass CSRF-Fehler korrekt behandelt werden

Sicherheits-Verbesserungen

  • Schutz vor Cross-Site Request Forgery (CSRF) Attacken
  • Detaillierte Logging für Sicherheitsverletzungen
  • Benutzerfreundliche Fehlerbehandlung
  • Konsistente Sicherheitsrichtlinien über alle API-Endpunkte

Status

Behoben: CSRF-Token-Problem vollständig gelöst Getestet: Alle API-Endpunkte funktionieren korrekt Dokumentiert: Vollständige Dokumentation erstellt