microdot.csrf — protecție CSRF

Respinge cererile care modifică starea și care provin cross-site. Verificarea rulează ca un hook before_request și folosește antetul Sec-Fetch-Site furnizat de browser (cu antetul Origin ca soluție de rezervă pentru browserele mai vechi, atunci când este asociat cu o instanță microdot.cors.CORS).

class CSRF

class microdot.csrf.CSRF(app: Microdot | None = None, cors=None, protect_all: bool = True, allow_subdomains: bool = False)
app

Instanța microdot.Microdot pe care se instalează. Opțional; apelează initialize() mai târziu dacă nu este furnizată.

cors

Instanța microdot.cors.CORS care definește originile de încredere ale aplicației. Necesară pentru recurgerea la antetul Origin pe browserele care nu trimit Sec-Fetch-Site. Opțional; fără ea, se aplică doar verificarea Sec-Fetch-Site.

protect_all

Dacă este True (implicit), fiecare rută cu excepția GET, HEAD și OPTIONS este protejată automat. Rutele pot fi exceptate individual cu exempt(). Dacă este False, nicio rută nu este protejată implicit, iar rutele individuale optează prin protect().

allow_subdomains

Dacă este True, cererile de la subdomeniile originilor aplicației sunt acceptate (same-site Sec-Fetch-Site sau sufix de origine corespunzător).

initialize(app: Microdot, cors=None)

Se atașează la app dacă construcția a fost amânată.

exempt(f)

Decorator care exceptează o rută de la protecția CSRF. Plasează-l imediat după decoratorul de rută:

@app.post('/webhook')
@csrf.exempt
async def webhook(request):
    # accepts cross-site POSTs
protect(f)

Decorator care forțează protecția CSRF pe o rută care altfel ar fi exceptată (de exemplu, o rută GET sau orice rută atunci când protect_all=False).

SAFE_METHODS: list

Atribut de clasă care listează metodele neprotejate implicit – ['GET', 'HEAD', 'OPTIONS'].

Exemplu:

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}

O cerere este permisă atunci când Sec-Fetch-Site raportează same-origin sau none (sau same-site când allow_subdomains=True). Dacă antetul lipsește, valoarea Origin a cererii este comparată cu lista de permise CORS. Cererile fără niciunul dintre antete sunt acceptate (tipic pentru apelurile API directe care nu sunt supuse CSRF din browser).