microdot.csrf — ochrana CSRF

Odmítá požadavky měnící stav, které pocházejí z jiného webu. Kontrola běží jako hook before_request a používá prohlížečem dodanou hlavičku Sec-Fetch-Site (s hlavičkou Origin jako záložní variantou pro starší prohlížeče, je-li spárována s instancí microdot.cors.CORS).

class CSRF

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

Instance microdot.Microdot, na kterou se nainstalovat. Volitelné; pokud není zadána, zavolejte initialize() později.

cors

Instance microdot.cors.CORS, která definuje důvěryhodné původy aplikace. Vyžadována pro záložní použití hlavičky Origin na prohlížečích, které neodesílají Sec-Fetch-Site. Volitelné; bez ní se uplatní pouze kontrola Sec-Fetch-Site.

protect_all

Pokud True (výchozí), je automaticky chráněna každá trasa kromě GET, HEAD a OPTIONS. Trasy lze jednotlivě vyjmout pomocí exempt(). Pokud False, není ve výchozím nastavení chráněna žádná trasa a jednotlivé trasy se přihlašují pomocí protect().

allow_subdomains

Pokud True, jsou přijímány požadavky ze subdomén původů aplikace (same-site Sec-Fetch-Site, nebo odpovídající přípona původu).

initialize(app: Microdot, cors=None)

Připojí se k app, pokud byla konstrukce odložena.

exempt(f)

Dekorátor, který vyjímá trasu z ochrany CSRF. Umístěte jej přímo za dekorátor trasy:

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

Dekorátor, který vynucuje ochranu CSRF na trase, která by jinak byla vyjmuta (např. trasa GET nebo každá trasa, když protect_all=False).

SAFE_METHODS: list

Atribut třídy uvádějící metody, které ve výchozím nastavení nejsou chráněny – ['GET', 'HEAD', 'OPTIONS'].

Příklad:

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}

Požadavek je povolen, když Sec-Fetch-Site hlásí same-origin nebo none (nebo same-site, když allow_subdomains=True). Pokud hlavička chybí, je Origin požadavku porovnán se seznamem povolených v CORS. Požadavky bez kterékoli z těchto hlaviček jsou přijaty (typické pro přímá volání API, která nepodléhají CSRF prohlížeče).