microdot.csrf — Protección CSRF¶
Rechaza las solicitudes que modifican el estado y que se originan entre sitios. La comprobación se ejecuta como un gancho before_request y utiliza el encabezado Sec-Fetch-Site proporcionado por el navegador (con el encabezado Origin como alternativa para navegadores más antiguos, cuando se combina con una instancia de microdot.cors.CORS).
class CSRF¶
- class microdot.csrf.CSRF(app: Microdot | None = None, cors=None, protect_all: bool = True, allow_subdomains: bool = False)¶
- app
La instancia de
microdot.Microdoten la que instalar. Opcional; llame ainitialize()más tarde si no se proporciona.- cors
La instancia de
microdot.cors.CORSque define los orígenes de confianza de la aplicación. Necesaria para recurrir al encabezadoOriginen navegadores que no envíanSec-Fetch-Site. Opcional; sin ella, solo se aplica la comprobación deSec-Fetch-Site.- protect_all
Si es
True(predeterminado), todas las rutas exceptoGET,HEADyOPTIONSse protegen automáticamente. Las rutas pueden eximirse individualmente conexempt(). Si esFalse, ninguna ruta se protege de forma predeterminada y las rutas individuales se adhieren conprotect().- allow_subdomains
Si es
True, se aceptan las solicitudes provenientes de subdominios de los orígenes de la aplicación (same-siteen Sec-Fetch-Site, o sufijo de origen coincidente).
- exempt(f)¶
Decorador que exime a una ruta de la protección CSRF. Colóquelo directamente después del decorador de ruta:
@app.post('/webhook') @csrf.exempt async def webhook(request): # accepts cross-site POSTs
- protect(f)¶
Decorador que fuerza la protección CSRF en una ruta que de otro modo estaría exenta (por ejemplo, una ruta
GETo todas las rutas cuandoprotect_all=False).
Ejemplo:
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}
Una solicitud se permite cuando Sec-Fetch-Site informa same-origin o none (o same-site cuando allow_subdomains=True). Si el encabezado está ausente, el Origin de la solicitud se compara con la lista de permitidos de CORS. Las solicitudes sin ninguno de los dos encabezados se aceptan (lo típico para las llamadas directas a la API que no están sujetas a CSRF del navegador).