microdot.csrf — protezione CSRF¶
Rifiuta le richieste che modificano lo stato e che hanno origine cross-site. Il controllo viene eseguito come hook before_request e utilizza l’header Sec-Fetch-Site fornito dal browser (con l’header Origin come fallback per i browser più vecchi, quando abbinato a un’istanza 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’istanza
microdot.Microdotsu cui installarsi. Opzionale; chiamainitialize()in seguito se non fornita.- cors
L’istanza
microdot.cors.CORSche definisce le origini attendibili dell’applicazione. Necessaria per il fallback all’headerOriginsui browser che non invianoSec-Fetch-Site. Opzionale; senza di essa si applica solo il controlloSec-Fetch-Site.- protect_all
Se
True(predefinito), ogni route tranneGET,HEADeOPTIONSè protetta automaticamente. Le route possono essere esentate individualmente conexempt(). SeFalse, nessuna route è protetta per impostazione predefinita e le singole route aderiscono conprotect().- allow_subdomains
Se
True, le richieste provenienti dai sottodomini delle origini dell’applicazione vengono accettate (Sec-Fetch-Sitesame-site, oppure suffisso di origine corrispondente).
- exempt(f)¶
Decoratore che esenta una route dalla protezione CSRF. Posizionalo direttamente dopo il decoratore della route:
@app.post('/webhook') @csrf.exempt async def webhook(request): # accepts cross-site POSTs
- protect(f)¶
Decoratore che forza la protezione CSRF su una route che altrimenti sarebbe esente (ad es. una route
GEToppure ogni route quandoprotect_all=False).
Esempio:
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}
Una richiesta è consentita quando Sec-Fetch-Site riporta same-origin o none (oppure same-site quando allow_subdomains=True). Se l’header è assente, l”Origin della richiesta viene confrontato con l’allow-list CORS. Le richieste prive di entrambi gli header vengono accettate (tipico per le chiamate API dirette non soggette al CSRF del browser).