microdot.csrf — CSRF-védelem

Elutasítja azokat az állapotmódosító kéréseket, amelyek más oldalról (cross-site) származnak. Az ellenőrzés egy before_request hookként fut, és a böngésző által megadott Sec-Fetch-Site fejlécet használja (az Origin fejléccel mint tartalékkal a régebbi böngészőkhöz, ha egy microdot.cors.CORS példánnyal párosul).

class CSRF

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

A microdot.Microdot példány, amelyre telepíteni kell. Opcionális; hívd meg a initialize() metódust később, ha nincs megadva.

cors

A microdot.cors.CORS példány, amely az alkalmazás megbízható eredeteit definiálja. Szükséges ahhoz, hogy az Origin fejlécre lehessen visszaesni azoknál a böngészőknél, amelyek nem küldenek Sec-Fetch-Site fejlécet. Opcionális; enélkül csak a Sec-Fetch-Site ellenőrzés érvényesül.

protect_all

Ha True (alapértelmezett), minden útvonal automatikusan védett a GET, HEAD és OPTIONS kivételével. Az útvonalak egyenként felmenthetők az exempt() segítségével. Ha False, alapértelmezetten egy útvonal sincs védve, és az egyes útvonalak a protect() segítségével kapcsolódnak be.

allow_subdomains

Ha True, az alkalmazás eredeteinek aldomainjeiről érkező kérések elfogadásra kerülnek (same-site Sec-Fetch-Site, vagy illeszkedő eredet-utótag).

initialize(app: Microdot, cors=None)

Csatolódik az app-hoz, ha a létrehozás el lett halasztva.

exempt(f)

Dekorátor, amely felment egy útvonalat a CSRF-védelem alól. Helyezd közvetlenül az útvonal-dekorátor után:

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

Dekorátor, amely kikényszeríti a CSRF-védelmet egy olyan útvonalon, amely egyébként fel lenne mentve (pl. egy GET útvonal, vagy minden útvonal protect_all=False esetén).

SAFE_METHODS: list

Osztályattribútum, amely felsorolja az alapértelmezetten nem védett metódusokat – ['GET', 'HEAD', 'OPTIONS'].

Példa:

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}

Egy kérés akkor engedélyezett, ha a Sec-Fetch-Site same-origin vagy none értéket jelez (vagy same-site értéket allow_subdomains=True esetén). Ha a fejléc hiányzik, a kérés Origin értéke a CORS engedélyezőlistájával lesz összevetve. Az egyik fejlécet sem tartalmazó kérések elfogadásra kerülnek (ez a tipikus a közvetlen API-hívásoknál, amelyek nincsenek kitéve a böngészős CSRF-nek).