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, zavolejteinitialize()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čkyOriginna prohlížečích, které neodesílajíSec-Fetch-Site. Volitelné; bez ní se uplatní pouze kontrolaSec-Fetch-Site.- protect_all
Pokud
True(výchozí), je automaticky chráněna každá trasa kroměGET,HEADaOPTIONS. Trasy lze jednotlivě vyjmout pomocíexempt(). PokudFalse, 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-siteSec-Fetch-Site, nebo odpovídající přípona původu).
- 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
GETnebo každá trasa, kdyžprotect_all=False).
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).