Zum Inhalt

Strikte Content-Type-Prüfung

🌐 Übersetzung durch KI und Menschen

Diese Übersetzung wurde von KI erstellt, angeleitet von Menschen. 🤝

Sie könnte Fehler enthalten, etwa Missverständnisse des ursprünglichen Sinns oder unnatürliche Formulierungen, usw. 🤖

Sie können diese Übersetzung verbessern, indem Sie uns helfen, die KI-LLM besser anzuleiten.

Englische Version

Standardmäßig verwendet FastAPI eine strikte Prüfung des Content-Type-Headers für JSON-Requestbodys. Das bedeutet, dass JSON-Requests einen gültigen Content-Type-Header (z. B. application/json) enthalten MÜSSEN, damit der Body als JSON geparst wird.

CSRF-Risiko

Dieses Standardverhalten schützt vor einer Klasse von Cross-Site Request Forgery (CSRF)-Angriffen in einem sehr spezifischen Szenario.

Diese Angriffe nutzen aus, dass Browser Skripte Requests senden lassen, ohne einen CORS-Preflight-Check durchzuführen, wenn sie:

  • keinen Content-Type-Header haben (z. B. mit fetch() und einem Blob-Body)
  • und keine Authentifizierungsdaten senden.

Diese Art von Angriff ist vor allem relevant, wenn:

  • die Anwendung lokal läuft (z. B. auf localhost) oder in einem internen Netzwerk
  • und die Anwendung keine Authentifizierung hat, sondern erwartet, dass jeder Request aus demselben Netzwerk vertrauenswürdig ist.

Beispielangriff

Stellen Sie sich vor, Sie bauen eine Möglichkeit, lokal einen KI-Agenten auszuführen.

Er stellt eine API bereit unter

http://localhost:8000/v1/agents/multivac

Es gibt auch ein Frontend unter

http://localhost:8000

Tipp

Beachten Sie, dass beide denselben Host haben.

Dann können Sie über das Frontend den KI-Agenten Dinge in Ihrem Namen erledigen lassen.

Da er lokal läuft und nicht im offenen Internet, entscheiden Sie sich, keine Authentifizierung einzurichten und vertrauen stattdessen einfach auf den Zugriff im lokalen Netzwerk.

Dann könnte einer Ihrer Benutzer es installieren und lokal ausführen.

Anschließend könnte er eine bösartige Website öffnen, z. B. so etwas wie

https://evilhackers.example.com

Und diese bösartige Website sendet Requests mit fetch() und einem Blob-Body an die lokale API unter

http://localhost:8000/v1/agents/multivac

Obwohl der Host der bösartigen Website und der lokalen App unterschiedlich ist, löst der Browser keinen CORS-Preflight-Request aus, weil:

  • sie ohne Authentifizierung läuft, es müssen keine Credentials gesendet werden.
  • der Browser annimmt, dass kein JSON gesendet wird (wegen des fehlenden Content-Type-Headers).

Dann könnte die bösartige Website den lokalen KI-Agenten dazu bringen, wütende Nachrichten an den Ex-Chef des Benutzers zu schicken ... oder Schlimmeres. 😅

Offenes Internet

Wenn Ihre App im offenen Internet läuft, würden Sie nicht „dem Netzwerk vertrauen“ und jedem erlauben, privilegierte Requests ohne Authentifizierung zu senden.

Angreifer könnten einfach ein Skript ausführen, um Requests an Ihre API zu senden, es ist keine Browserinteraktion nötig. Daher sichern Sie wahrscheinlich schon alle privilegierten Endpunkte.

In diesem Fall gilt dieser Angriff / dieses Risiko nicht für Sie.

Dieses Risiko und dieser Angriff sind vor allem relevant, wenn die App im lokalen Netzwerk läuft und das die einzige angenommene Schutzmaßnahme ist.

Requests ohne Content-Type erlauben

Wenn Sie Clients unterstützen müssen, die keinen Content-Type-Header senden, können Sie die strikte Prüfung deaktivieren, indem Sie strict_content_type=False setzen:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI(strict_content_type=False)


class Item(BaseModel):
    name: str
    price: float


@app.post("/items/")
async def create_item(item: Item):
    return item

Mit dieser Einstellung werden Requests ohne Content-Type-Header im Body als JSON geparst. Das entspricht dem Verhalten älterer FastAPI-Versionen.

Info

Dieses Verhalten und diese Konfiguration wurden in FastAPI 0.132.0 hinzugefügt.