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.Microdot na koju se treba instalirati. Opcionalno; kasnije pozovite initialize() ako nije zadana.

cors

Instanca microdot.cors.CORS koja definira pouzdane izvore aplikacije. Potrebna za vraćanje na zaglavlje Origin na preglednicima koji ne šalju Sec-Fetch-Site. Opcionalno; bez nje se primjenjuje samo provjera Sec-Fetch-Site.

protect_all

Ako je True (zadano), svaka ruta osim GET, HEAD i OPTIONS automatski je zaštićena. Rute se mogu pojedinačno izuzeti pomoću exempt(). Ako je False, nijedna ruta nije zaštićena prema zadanim postavkama, a pojedinačne rute pristupaju zaštiti pomoću protect().

allow_subdomains

Ako je True, prihvaćaju se zahtjevi s poddomena aplikacijskih izvora (same-site Sec-Fetch-Site, ili podudarajući sufiks izvora).

initialize(app: Microdot, cors=None)

Prikvačuje se na app ako je konstrukcija bila odgođena.

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. GET ruta ili svaka ruta kada je protect_all=False).

SAFE_METHODS: list

Atribut klase koji navodi metode koje nisu zaštićene prema zadanim postavkama – ['GET', 'HEAD', 'OPTIONS'].

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