microdot.csrf — CSRF-bescherming¶
Weigert toestandsveranderende verzoeken die cross-site afkomstig zijn. De controle draait als een before_request-hook en gebruikt de door de browser geleverde Sec-Fetch-Site-header (met de Origin-header als fallback voor oudere browsers, in combinatie met een microdot.cors.CORS-instantie).
class CSRF¶
- class microdot.csrf.CSRF(app: Microdot | None = None, cors=None, protect_all: bool = True, allow_subdomains: bool = False)¶
- app
De
microdot.Microdot-instantie waarop geïnstalleerd moet worden. Optioneel; roep laterinitialize()aan indien niet opgegeven.- cors
De
microdot.cors.CORS-instantie die de vertrouwde origins van de applicatie definieert. Vereist om terug te kunnen vallen op deOrigin-header bij browsers die geenSec-Fetch-Siteversturen. Optioneel; zonder deze geldt alleen deSec-Fetch-Site-controle.- protect_all
Als
True(standaard) wordt elke route behalveGET,HEADenOPTIONSautomatisch beschermd. Routes kunnen individueel worden uitgezonderd metexempt(). AlsFalseworden er standaard geen routes beschermd en kiezen individuele routes ervoor metprotect().- allow_subdomains
Als
Trueworden verzoeken van subdomeinen van de origins van de applicatie geaccepteerd (same-siteSec-Fetch-Site, of een overeenkomend origin-achtervoegsel).
- exempt(f)¶
Decorator die een route uitzondert van CSRF-bescherming. Plaats deze direct na de route-decorator:
@app.post('/webhook') @csrf.exempt async def webhook(request): # accepts cross-site POSTs
- protect(f)¶
Decorator die CSRF-bescherming afdwingt op een route die anders zou zijn uitgezonderd (bijv. een
GET-route of elke route wanneerprotect_all=False).
Voorbeeld:
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}
Een verzoek wordt toegestaan wanneer Sec-Fetch-Site same-origin of none meldt (of same-site wanneer allow_subdomains=True). Als de header ontbreekt, wordt de Origin van het verzoek vergeleken met de CORS-toegestane lijst. Verzoeken zonder beide headers worden geaccepteerd (typisch voor directe API-aanroepen die niet onderhevig zijn aan browser-CSRF).