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.
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 utilisantfetch()avec un corpsBlob) - 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.