microdot.csrf — CSRF zaštita¶
Odbija zahtjeve koji mijenjaju stanje, a potječu s drugog mjesta (cross-site). Provjera se izvodi kao before_request hook i koristi zaglavlje Sec-Fetch-Site koje pruža preglednik (sa zaglavljem Origin kao rezervnom opcijom za starije preglednike, kada se uskladi s instancom microdot.cors.CORS).
class CSRF¶
- class microdot.csrf.CSRF(app: Microdot | None = None, cors=None, protect_all: bool = True, allow_subdomains: bool = False)¶
- app
Instanca
microdot.Microdotna koju se treba instalirati. Opcionalno; kasnije pozoviteinitialize()ako nije zadana.- cors
Instanca
microdot.cors.CORSkoja definira pouzdane izvore aplikacije. Potrebna za vraćanje na zaglavljeOriginna preglednicima koji ne šaljuSec-Fetch-Site. Opcionalno; bez nje se primjenjuje samo provjeraSec-Fetch-Site.- protect_all
Ako je
True(zadano), svaka ruta osimGET,HEADiOPTIONSautomatski je zaštićena. Rute se mogu pojedinačno izuzeti pomoćuexempt(). Ako jeFalse, nijedna ruta nije zaštićena prema zadanim postavkama, a pojedinačne rute pristupaju zaštiti pomoćuprotect().- allow_subdomains
Ako je
True, prihvaćaju se zahtjevi s poddomena aplikacijskih izvora (same-siteSec-Fetch-Site, ili podudarajući sufiks izvora).
- exempt(f)¶
Dekorator koji izuzima rutu od CSRF zaštite. Postavite ga izravno nakon dekoratora rute:
@app.post('/webhook') @csrf.exempt async def webhook(request): # accepts cross-site POSTs
- protect(f)¶
Dekorator koji prisiljava CSRF zaštitu na ruti koja bi inače bila izuzeta (npr.
GETruta ili svaka ruta kada jeprotect_all=False).
Primjer:
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}
Zahtjev je dopušten kada Sec-Fetch-Site izvještava same-origin ili none (ili same-site kada je allow_subdomains=True). Ako zaglavlje nedostaje, Origin zahtjeva uspoređuje se s CORS listom dopuštenih. Zahtjevi bez ijednog zaglavlja se prihvaćaju (uobičajeno za izravne API pozive koji nisu podložni CSRF-u preglednika).