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.Microdot en la que instalar. Opcional; llame a initialize() más tarde si no se proporciona.

cors

La instancia de microdot.cors.CORS que define los orígenes de confianza de la aplicación. Necesaria para recurrir al encabezado Origin en navegadores que no envían Sec-Fetch-Site. Opcional; sin ella, solo se aplica la comprobación de Sec-Fetch-Site.

protect_all

Si es True (predeterminado), todas las rutas excepto GET, HEAD y OPTIONS se protegen automáticamente. Las rutas pueden eximirse individualmente con exempt(). Si es False, ninguna ruta se protege de forma predeterminada y las rutas individuales se adhieren con protect().

allow_subdomains

Si es True, se aceptan las solicitudes provenientes de subdominios de los orígenes de la aplicación (same-site en Sec-Fetch-Site, o sufijo de origen coincidente).

initialize(app: Microdot, cors=None)

Se adjunta a app si la construcción se difirió.

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 GET o todas las rutas cuando protect_all=False).

SAFE_METHODS: list

Atributo de clase que enumera los métodos que no están protegidos de forma predeterminada: ['GET', 'HEAD', 'OPTIONS'].

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).