Skip to main content

Verbatim copy of Django's CSRF middleware, but with more verbose error messages.

Project description

Verbose CSRF Middleware

This is a verbatim copy of the Django CSRF middleware, but it is more verbose in its failures.

This is especially useful when CSRF failures are happening due to some misconfiguration of your server, your reverse proxy, or some combination thereof.

Django 4.2 introduced various "more strict" CSRF checks, in particular checks on the Origin and Referer header. This middleware can help you debug problems with those checks in your setup.

Usage:

In your settings.py file, in the MIDDLEWARE_CLASSES, search for this line:

    'django.middleware.csrf.CsrfViewMiddleware',  # search this to remove it

and then replace it with the line below:

    'verbose_csrf_middleware.CsrfViewMiddleware',

Seeing the output

You'll probably want to see the output of the middleware somewhere. You can either:

  1. Turn on DEBUG
  2. Make sure messages to the logger "django.security.csrf" (level: warning) end up in a location you can read.
  3. Add a template 403_csrf.html to your templates directory. Make sure the template renders "reason".
  4. Add a CSRF_FAILURE_VIEW

Note that optinos 1, 3 and 4 have at least theoretical security implications, because by the nature of "verbose" they expose some information to end-users.

Why is this better?

Compare the below; - is Django's standard message, + is the verbose one. You'll see the latter contains much more useful info.

- Origin checking failed - http://nonmatching does not match any trusted origins.
+ Origin header does not match (deduced) Host: 'http://nonmatching' != 'http://testserver'

- Origin checking failed - https://thisiswrong.example.org does not match any trusted origins.
+ Origin header does not match (deduced) Host: 'https://thisiswrong.example.org' != 'https://testserver'; nor any of the CSRF_TRUSTED_ORIGINS: ['https://subdomain.example.org']

- Origin checking failed - https://anything.example.org does not match any trusted origins.
+ Origin header does not match (deduced) Host: 'https://anything.example.org' != 'https://testserver'; nor any of the CSRF_TRUSTED_ORIGINS: ['http://*.example.org (wrong scheme)']

- Origin checking failed - null does not match any trusted origins.
+ Origin header does not match (deduced) Host: 'null' != 'http://testserver'

- Referer checking failed - https://refererheader.org/ does not match any trusted origins.
+ Referer checking failed - 'refererheader.org' does not match any of ['csrf_trusted_origin.org', 'testserver'].

- Referer checking failed - https://www.wrong.org/ does not match any trusted origins.
+ Referer checking failed - 'www.wrong.org' does not match any of ['testserver'].

- Referer checking failed - https://nonmatching.example.org/ does not match any trusted origins.
+ Referer checking failed - 'nonmatching.example.org' does not match any of ['expected.example.org'].

(this output is generated by running the test suite, but turning on Django's standard middleware)

Compatability

This middleware is a verbatim copy of Django 4.2's csrf middleware, with changes for verbosity. There were no (meaningful) changes between Django 4.2 and Django 5.1 to that code. So the middleware is compatible with

  • Django 4.2
  • Django 5.0
  • Django 5.1

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

verbose_csrf_middleware-1.0.1.tar.gz (16.4 kB view details)

Uploaded Source

Built Distribution

verbose_csrf_middleware-1.0.1-py3-none-any.whl (12.9 kB view details)

Uploaded Python 3

File details

Details for the file verbose_csrf_middleware-1.0.1.tar.gz.

File metadata

File hashes

Hashes for verbose_csrf_middleware-1.0.1.tar.gz
Algorithm Hash digest
SHA256 acf14795f4d15b1daadd9f181c2957ec6cd077c9a084c64c97be6ca5e86f28d5
MD5 092abadc07889063d441aa38f8eafafe
BLAKE2b-256 f07969f84a8ab018bffa94af6c746a4e78af05b0c85c47cef9d6a9d9108c46a4

See more details on using hashes here.

File details

Details for the file verbose_csrf_middleware-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for verbose_csrf_middleware-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1ebf7cd7a8c30558db5571bdc544143502832a93528d5440f243815ffccae565
MD5 4dc20051c0d7d69ddd4b8f010b6333a3
BLAKE2b-256 8d10cbe60b76f1911cec9c1233983a877eb4a37aa7b577b1d8bd48f327724f0f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page