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.Microdotpe care se instalează. Opțional; apeleazăinitialize()mai târziu dacă nu este furnizată.- cors
Instanța
microdot.cors.CORScare definește originile de încredere ale aplicației. Necesară pentru recurgerea la antetulOriginpe browserele care nu trimitSec-Fetch-Site. Opțional; fără ea, se aplică doar verificareaSec-Fetch-Site.- protect_all
Dacă este
True(implicit), fiecare rută cu excepțiaGET,HEADșiOPTIONSeste protejată automat. Rutele pot fi exceptate individual cuexempt(). Dacă esteFalse, nicio rută nu este protejată implicit, iar rutele individuale optează prinprotect().- allow_subdomains
Dacă este
True, cererile de la subdomeniile originilor aplicației sunt acceptate (same-siteSec-Fetch-Site sau sufix de origine corespunzător).
- 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ă
GETsau orice rută atunci cândprotect_all=False).
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).