FastAPI CORS: 5 Fehler und sichere Konfiguration
April 9, 2026FastAPI CORS: 5 häufige Fehler und wie Sie Ihr Backend wirklich sichern
Die Notwendigkeit von CORS: Mehr als nur Browser-Kompatibilität
Häufige CORS-Konfigurationsfehler in FastAPI-Projekten
1. Der Wildcard-Fehler: allow_origins=['*'] in der Produktion
2. Die explosive Kombination: allow_credentials=True mit Wildcard Origins
3. Zu breite allow_methods und allow_headers
4. Falsche max_age-Einstellung für Preflight-Anfragen
5. Fehlende oder falsche Antworten für OPTIONS-Anfragen
Sichere CORS-Strategien für FastAPI in der Praxis
Spezifische Origins sind Pflicht (Nie Wildcards in Prod!)
Python
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware
import os
app = FastAPI(title="Sichere API")
# Sichere und spezifische CORS-Konfiguration für Produktion
# Hier könnten Hostnames aus Umgebungsvariablen kommen
# Dies ermöglicht eine einfache Anpassung in verschiedenen Umgebungen (Test, Staging, Prod)
env_allowed_hosts_str = os.environ.get("CORS_ALLOWED_HOSTS", "")
env_allowed_hosts = [f"https://{h.strip()}" for h in env_allowed_hosts_str.split(',') if h.strip()]
# Liste der explizit erlaubten Origins
origins = [
"https://meine-frontend-domain.com",
"https://admin.meine-frontend-domain.com",
"http://localhost:3000" # Nur für lokale Entwicklung und sollte in Produktion entfernt/geändert werden
]
# Füge dynamische Origins hinzu und entferne Duplikate
origins.extend(env_allowed_hosts)
origins = list(set(origins)) # Entfernt Duplikate
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True, # WICHTIG: Nur mit spezifischen Origins verwenden!
allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"], # Nur benötigte Methoden
allow_headers=["X-Requested-With", "Content-Type", "Accept", "Authorization", "X-API-Key"], # Nur benötigte Header
max_age=600 # Cache Preflight-Anfragen für 10 Minuten
)
@app.get("/items")
async def read_items():
return {"message": "Sichere Daten vom Backend"}
@app.post("/items")
async def create_item(item: dict):
return {"message": f"Artikel erstellt: {item['name']}"}
# DIES IST EINE FALSCHE UND GEFÄHRLICHE KONFIGURATION! NIEMALS IN PRODUKTION VERWENDEN!
# app.add_middleware(
# CORSMiddleware,
# allow_origins=["*"],
# allow_credentials=True, # GROSSES SICHERHEITSRISIKO! Ermöglicht CSRF und Datenlecks von jeder Domain.
# allow_methods=["*"],
# allow_headers=["*"],
# max_age=0 # Auch wenn max_age 0 wäre, bleibt die Grundkonfiguration extrem unsicher.
# )
Dynamische Origins für komplexe Umgebungen
Testen der CORS-Konfiguration mit curl
Bash
# Starten Sie Ihre FastAPI-Anwendung (z.B. mit: uvicorn main:app --reload)
# Stellen Sie sicher, dass Ihre Anwendung auf http://localhost:8000 läuft
# Test einer Preflight-Anfrage (OPTIONS) von einer erlaubten Origin
curl -v -X OPTIONS http://localhost:8000/items \
-H "Origin: https://meine-frontend-domain.com" \
-H "Access-Control-Request-Method: GET" \
-H "Access-Control-Request-Headers: Authorization,Content-Type"
# Erwartete Antwort-Header (Auszug):
# < Access-Control-Allow-Origin: https://meine-frontend-domain.com
# < Access-Control-Allow-Credentials: true
# < Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
# < Access-Control-Allow-Headers: X-Requested-With, Content-Type, Accept, Authorization, X-API-Key
# < Access-Control-Max-Age: 600
# Test einer GET-Anfrage von einer erlaubten Origin
curl -v http://localhost:8000/items \
-H "Origin: https://meine-frontend-domain.com"
# Erwartete Antwort-Header (Auszug):
# < Access-Control-Allow-Origin: https://meine-frontend-domain.com
# < Access-Control-Allow-Credentials: true
# Test einer GET-Anfrage von einer NICHT-erlaubten Origin (dies sollte vom Browser blockiert werden)
# In der Konsole des Browsers sehen Sie einen CORS-Fehler.
# curl -v http://localhost:8000/items \
# -H