microdot.csrf — CSRF-skydd

Avvisar tillståndsändrande begäranden som har sitt ursprung från en annan webbplats. Kontrollen körs som en before_request-hook och använder det webbläsarlämnade huvudet Sec-Fetch-Site (med huvudet Origin som reserv för äldre webbläsare, när det paras med en microdot.cors.CORS-instans).

class CSRF

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

Instansen microdot.Microdot att installera på. Valfri; anropa initialize() senare om den inte anges.

cors

Instansen microdot.cors.CORS som definierar applikationens betrodda ursprung. Krävs för att falla tillbaka på huvudet Origin på webbläsare som inte skickar Sec-Fetch-Site. Valfri; utan den gäller endast kontrollen av Sec-Fetch-Site.

protect_all

Om True (standard) skyddas varje rutt utom GET, HEAD och OPTIONS automatiskt. Rutter kan undantas individuellt med exempt(). Om False skyddas inga rutter som standard och enskilda rutter ansluter sig med protect().

allow_subdomains

Om True accepteras begäranden från subdomäner till applikationens ursprung (same-site Sec-Fetch-Site, eller matchande ursprungssuffix).

initialize(app: Microdot, cors=None)

Koppla till app om konstruktionen sköts upp.

exempt(f)

Dekorator som undantar en rutt från CSRF-skydd. Placera den direkt efter rutt-dekoratorn:

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

Dekorator som framtvingar CSRF-skydd på en rutt som annars skulle vara undantagen (t.ex. en GET-rutt eller varje rutt när protect_all=False).

SAFE_METHODS: list

Klassattribut som listar metoder som inte skyddas som standard – ['GET', 'HEAD', 'OPTIONS'].

Exempel:

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}

En begäran tillåts när Sec-Fetch-Site rapporterar same-origin eller none (eller same-site när allow_subdomains=True). Om huvudet saknas matchas begärans Origin mot CORS-tillåtelselistan. Begäranden med inget av huvudena accepteras (typiskt för direkta API-anrop som inte omfattas av webbläsarbaserad CSRF).