microdot.csrf --- Perlindungan CSRF

Menolak permintaan yang mengubah status yang berasal dari lintas situs. Pemeriksaan berjalan sebagai hook before_request dan menggunakan header Sec-Fetch-Site yang disediakan browser (dengan header Origin sebagai fallback untuk browser lama, ketika dipasangkan dengan instans microdot.cors.CORS).

class CSRF

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

Instans microdot.Microdot yang akan diinstall. Opsional; panggil initialize() nanti jika tidak diberikan.

cors

Instans microdot.cors.CORS yang mendefinisikan asal tepercaya aplikasi. Diperlukan untuk fallback ke header Origin pada browser yang tidak mengirimkan Sec-Fetch-Site. Opsional; tanpanya, hanya pemeriksaan Sec-Fetch-Site yang berlaku.

protect_all

Jika True (default), setiap rute kecuali GET, HEAD, dan OPTIONS dilindungi secara otomatis. Rute dapat dikecualikan secara individual dengan exempt(). Jika False, tidak ada rute yang dilindungi secara default dan rute individual ikut serta dengan protect().

allow_subdomains

Jika True, permintaan dari subdomain asal aplikasi diterima (same-site Sec-Fetch-Site, atau akhiran asal yang cocok).

initialize(app: Microdot, cors=None)

Lampirkan ke app jika konstruksi ditunda.

exempt(f)

Dekorator yang mengecualikan rute dari perlindungan CSRF. Letakkan langsung setelah dekorator rute:

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

Dekorator yang memaksa perlindungan CSRF pada rute yang sebaliknya akan dikecualikan (mis. rute GET atau setiap rute saat protect_all=False).

SAFE_METHODS: list

Atribut kelas yang mencantumkan metode yang tidak dilindungi secara default -- ['GET', 'HEAD', 'OPTIONS'].

Contoh:

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}

Permintaan diizinkan ketika Sec-Fetch-Site melaporkan same-origin atau none (atau same-site ketika allow_subdomains=True). Jika header tidak ada, Origin permintaan dicocokkan dengan daftar izin CORS. Permintaan tanpa header mana pun diterima (tipikal untuk panggilan API langsung yang tidak tunduk pada CSRF browser).