microdot.csrf — protection CSRF¶
Rejette les requêtes modifiant l’état qui proviennent d’un site tiers. La vérification s’exécute en tant que hook before_request et utilise l’en-tête Sec-Fetch-Site fourni par le navigateur (avec l’en-tête Origin comme solution de repli pour les navigateurs plus anciens, lorsqu’il est associé à une instance microdot.cors.CORS).
class CSRF¶
- class microdot.csrf.CSRF(app: Microdot | None = None, cors=None, protect_all: bool = True, allow_subdomains: bool = False)¶
- app
L’instance
microdot.Microdotsur laquelle s’installer. Facultatif ; appelezinitialize()plus tard si non fourni.- cors
L’instance
microdot.cors.CORSqui définit les origines de confiance de l’application. Requise pour pouvoir se replier sur l’en-têteOriginsur les navigateurs qui n’envoient pasSec-Fetch-Site. Facultatif ; sans elle, seule la vérificationSec-Fetch-Sites’applique.- protect_all
Si
True(par défaut), chaque route saufGET,HEADetOPTIONSest protégée automatiquement. Les routes peuvent être exemptées individuellement avecexempt(). SiFalse, aucune route n’est protégée par défaut et les routes individuelles adhèrent avecprotect().- allow_subdomains
Si
True, les requêtes provenant des sous-domaines des origines de l’application sont acceptées (same-siteSec-Fetch-Site, ou suffixe d’origine correspondant).
- exempt(f)¶
Décorateur qui exempte une route de la protection CSRF. Placez-le directement après le décorateur de route
@app.post('/webhook') @csrf.exempt async def webhook(request): # accepts cross-site POSTs
- protect(f)¶
Décorateur qui force la protection CSRF sur une route qui serait autrement exemptée (par ex. une route
GETou chaque route lorsqueprotect_all=False).
Exemple
from microdot import Microdot
from microdot.cors import CORS
from microdot.csrf import CSRF
app = Microdot()
cors = CORS(app, allowed_origins=['https://app.example.com'])
csrf = CSRF(app, cors=cors)
@app.post('/api/save')
async def save(request):
# automatically CSRF-protected
return {'ok': True}
Une requête est autorisée lorsque Sec-Fetch-Site rapporte same-origin ou none (ou same-site lorsque allow_subdomains=True). Si l’en-tête est absent, l”Origin de la requête est comparée à la liste d’autorisation CORS. Les requêtes sans aucun de ces en-têtes sont acceptées (typique pour les appels d’API directs qui ne sont pas soumis au CSRF du navigateur).