Skip to content

gnat/csrf-starlette-fastapi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 

Repository files navigation

Why you may not need a CSRF Middleware in 2022

Recent cookie enhancements can solve CSRF for you:

  1. Set one cookie to "lax", set one cookie to "strict".
  2. Check for the "strict" cookie whenever there's a database write (or other sensitive action).

The "strict" cookie will not exist in situations where CSRF will be a threat.

References

Thanks for coming. 🤔 However if you still wish to use a middleware for some reason, please continue!

csrf-starlette-fastapi

Dead simple CSRF security middleware for Starlette ⭐ and Fast API ⚡

  • Will work with either a <input type="hidden"> field or ajax request headers, interchangeably.
  • Uses stateless Double Submit Cookie method, like Django.
  • Tiny, easy to audit.

Install

Add csrf_middleware.py to your project /middleware folder.

Add to Starlette

from starlette.applications import Starlette
from starlette.middleware import Middleware
from middleware.csrf_middleware import CSRFMiddleware

routes = ...

middleware = [
    Middleware(CSRFMiddleware)
]

app = Starlette(routes=routes, middleware=middleware)

Add to FastAPI

from fastapi import FastAPI
from middleware.csrf_middleware import CSRFMiddleware

app = FastAPI()
app.add_middleware(CSRFMiddleware)

Usage

  • Directly with HTML.
    • Pass request.state.csrftoken to your template engine.
    • <input type="hidden" name="csrftoken" value="{{ csrftoken }}" />
  • Using htmx ♥️: <body hx-headers='{"csrftoken": "{{ csrftoken }}"}'>
  • Using Javascript frameworks: headers: { 'csrftoken': '{{ csrftoken }}' }

Why?

To make available something more simple and auditable than the typical libraries for this as of 2022:

Releases

No releases published

Packages

No packages published

Languages