Aller au contenu

Vérifier strictement le Content-Type

🌐 Traduction par IA et humains

Cette traduction a Ă©tĂ© rĂ©alisĂ©e par une IA guidĂ©e par des humains. đŸ€

Elle peut contenir des erreurs d'interprĂ©tation du sens original, ou paraĂźtre peu naturelle, etc. đŸ€–

Vous pouvez améliorer cette traduction en nous aidant à mieux guider le LLM d'IA.

Version anglaise

Par dĂ©faut, FastAPI applique une vĂ©rification stricte de l’en-tĂȘte Content-Type pour les corps de requĂȘtes JSON ; cela signifie que les requĂȘtes JSON doivent inclure un en-tĂȘte Content-Type valide (par ex. application/json) pour que le corps soit analysĂ© comme JSON.

Risque CSRF

Ce comportement par dĂ©faut offre une protection contre une catĂ©gorie d’attaques de Cross-Site Request Forgery (CSRF) dans un scĂ©nario trĂšs spĂ©cifique.

Ces attaques exploitent le fait que les navigateurs permettent Ă  des scripts d’envoyer des requĂȘtes sans effectuer de prĂ©-vĂ©rification CORS (preflight) lorsqu’ils :

  • n’ont pas d’en-tĂȘte Content-Type (par ex. en utilisant fetch() avec un corps Blob)
  • et n’envoient aucune information d’authentification.

Ce type d’attaque est surtout pertinent lorsque :

  • l’application s’exĂ©cute localement (par ex. sur localhost) ou sur un rĂ©seau interne
  • et l’application n’a aucun mĂ©canisme d’authentification, elle part du principe que toute requĂȘte provenant du mĂȘme rĂ©seau est fiable.

Exemple d’attaque

Imaginez que vous mettiez au point un moyen d’exĂ©cuter un agent IA local.

Il expose une API à l’adresse

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

Il y a aussi un frontend à l’adresse

http://localhost:8000

Astuce

Notez qu’ils ont le mĂȘme hĂŽte.

Vous pouvez alors, via le frontend, amener l’agent IA à effectuer des actions en votre nom.

Comme il s’exĂ©cute localement, et non sur l’Internet ouvert, vous dĂ©cidez de ne mettre en place aucun mĂ©canisme d’authentification, en vous fiant simplement Ă  l’accĂšs au rĂ©seau local.

Un de vos utilisateurs pourrait alors l’installer et l’exĂ©cuter localement.

Il pourrait ensuite ouvrir un site malveillant, par exemple quelque chose comme

https://evilhackers.example.com

Et ce site malveillant enverrait des requĂȘtes en utilisant fetch() avec un corps Blob vers l’API locale Ă  l’adresse

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

MĂȘme si l’hĂŽte du site malveillant et celui de l’application locale sont diffĂ©rents, le navigateur ne dĂ©clenchera pas de prĂ©-vĂ©rification CORS (preflight) parce que :

  • Elle s’exĂ©cute sans aucune authentification, il n’y a pas Ă  envoyer d’informations d’authentification.
  • Le navigateur pense qu’il n’envoie pas de JSON (faute d’en-tĂȘte Content-Type).

Le site malveillant pourrait alors amener l’agent IA local à envoyer des messages en colùre à l’ancien patron de l’utilisateur ... ou pire. 😅

Internet ouvert

Si votre application est exposĂ©e sur l’Internet ouvert, vous ne « ferez pas confiance au rĂ©seau » et ne laisserez pas n’importe qui envoyer des requĂȘtes privilĂ©giĂ©es sans authentification.

Des attaquants pourraient simplement exĂ©cuter un script pour envoyer des requĂȘtes Ă  votre API, sans interaction avec le navigateur ; vous sĂ©curisez donc probablement dĂ©jĂ  tout endpoint privilĂ©giĂ©.

Dans ce cas, cette attaque / ce risque ne vous concerne pas.

Ce risque et cette attaque sont surtout pertinents lorsque l’application s’exĂ©cute sur le rĂ©seau local et que c’est la seule protection supposĂ©e.

Autoriser les requĂȘtes sans Content-Type

Si vous devez prendre en charge des clients qui n’envoient pas d’en-tĂȘte Content-Type, vous pouvez dĂ©sactiver la vĂ©rification stricte en dĂ©finissant strict_content_type=False :

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

Avec ce paramĂštre, les requĂȘtes sans en-tĂȘte Content-Type verront leur corps analysĂ© comme JSON, ce qui correspond au comportement des anciennes versions de FastAPI.

Info

Ce comportement et cette configuration ont été ajoutés dans FastAPI 0.132.0.