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.Microdot sur laquelle s’installer. Facultatif ; appelez initialize() plus tard si non fourni.

cors

L’instance microdot.cors.CORS qui définit les origines de confiance de l’application. Requise pour pouvoir se replier sur l’en-tête Origin sur les navigateurs qui n’envoient pas Sec-Fetch-Site. Facultatif ; sans elle, seule la vérification Sec-Fetch-Site s’applique.

protect_all

Si True (par défaut), chaque route sauf GET, HEAD et OPTIONS est protégée automatiquement. Les routes peuvent être exemptées individuellement avec exempt(). Si False, aucune route n’est protégée par défaut et les routes individuelles adhèrent avec protect().

allow_subdomains

Si True, les requêtes provenant des sous-domaines des origines de l’application sont acceptées (same-site Sec-Fetch-Site, ou suffixe d’origine correspondant).

initialize(app: Microdot, cors=None)

S’attache à app si la construction a été différée.

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 GET ou chaque route lorsque protect_all=False).

SAFE_METHODS: list

Attribut de classe listant les méthodes qui ne sont pas protégées par défaut – ['GET', 'HEAD', 'OPTIONS'].

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).