microdot.csrf — CSRF-suojaus

Hylkää tilaa muuttavat pyynnöt, jotka ovat peräisin eri sivustolta. Tarkistus suoritetaan before_request-koukkuna ja se käyttää selaimen toimittamaa Sec-Fetch-Site-otsaketta (sekä Origin-otsaketta varajärjestelynä vanhemmille selaimille, kun se on yhdistetty microdot.cors.CORS-instanssiin).

class CSRF

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

microdot.Microdot-instanssi, johon asennetaan. Valinnainen; kutsu initialize() myöhemmin, jos sitä ei anneta.

cors

microdot.cors.CORS-instanssi, joka määrittää sovelluksen luotetut alkuperät. Vaaditaan Origin-otsakkeeseen turvautumiseen selaimilla, jotka eivät lähetä Sec-Fetch-Site-otsaketta. Valinnainen; ilman sitä vain Sec-Fetch-Site-tarkistus on käytössä.

protect_all

Jos True (oletus), jokainen reitti paitsi GET, HEAD ja OPTIONS suojataan automaattisesti. Reittejä voidaan vapauttaa yksitellen metodilla exempt(). Jos False, mitään reittejä ei suojata oletuksena ja yksittäiset reitit liittyvät mukaan metodilla protect().

allow_subdomains

Jos True, sovelluksen alkuperien aliverkkotunnuksista tulevat pyynnöt hyväksytään (same-site Sec-Fetch-Site tai täsmäävä alkuperän pääte).

initialize(app: Microdot, cors=None)

Liittyy kohteeseen app, jos rakentaminen lykättiin.

exempt(f)

Dekoraattori, joka vapauttaa reitin CSRF-suojauksesta. Sijoita se suoraan reittidekoraattorin jälkeen:

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

Dekoraattori, joka pakottaa CSRF-suojauksen reitille, joka muuten olisi vapautettu (esim. GET-reitti tai jokainen reitti, kun protect_all=False).

SAFE_METHODS: list

Luokka-attribuutti, joka luettelee metodit, joita ei oletuksena suojata – ['GET', 'HEAD', 'OPTIONS'].

Esimerkki:

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}

Pyyntö sallitaan, kun Sec-Fetch-Site raportoi same-origin tai none (tai same-site, kun allow_subdomains=True). Jos otsake puuttuu, pyynnön Origin täsmätään CORS-sallittujen listaa vasten. Pyynnöt, joista molemmat otsakkeet puuttuvat, hyväksytään (tyypillistä suorille API-kutsuille, joita selaimen CSRF ei koske).