#33529: Possibly Incorrect statement in the docs about CRSF tokens
------------------------------+--------------------------------------
     Reporter:  Michael       |                    Owner:  nobody
         Type:  Bug           |                   Status:  closed
    Component:  contrib.auth  |                  Version:  4.0
     Severity:  Normal        |               Resolution:  invalid
     Keywords:                |             Triage Stage:  Unreviewed
    Has patch:  0             |      Needs documentation:  0
  Needs tests:  0             |  Patch needs improvement:  0
Easy pickings:  0             |                    UI/UX:  0
------------------------------+--------------------------------------

Comment (by Michael):

 Replying to [comment:6 Florian Apolloner]:
 > Hi Michael,
 >
 > the CSRF token is POSTed but that does not mean it has to originate from
 the DOM. The middleware operates on the HTTP level, all it sees is post
 data, it has no concept of the DOM. That is why I ment I do not understand
 what the note is (well was, this is fixed in the dev branch) trying to
 say.

 Hi Florian,

 Thanks for this and the clarification of how the admin site handles it. I
 didn't reply to the other points because I was reading up a bit, because I
 think I don't understand the whole system and did not want to waste your
 time. I have also been reading that diff, and I see it changes the text
 from

     The CSRF token is also present in the DOM, but only if explicitly
 included
     using `csrf_token` in a template. The cookie contains the canonical
     token; the ``CsrfViewMiddleware`` will prefer the cookie to the token
 in
     the DOM. Regardless, you're guaranteed to have the cookie if the token
 is
     present in the DOM, so you should use the cookie!

 to

     The CSRF token is also present in the DOM in a masked form, but only
 if
     explicitly included using `csrf_token` in a template. The cookie
     contains the canonical, unmasked token. The
     :class:`~django.middleware.csrf.CsrfViewMiddleware` will accept
 either.
     However, in order to protect against `BREACH`_ attacks, it's
 recommended to
     use a masked token.

 I am guessing the new behaviour is if the CSRF Middleware receives a
 request that has the `X-CSRFToken` header, and a `csrftoken` key in the
 POST data, it will prefer the POST data?

 Maybe a note about how the CSRF Middleware verifies the token when :
 `X-CSRFToken` header *and* the POST  `csrftoken` entry are *both*
 provided. This is a common scenario if one logs out and in another tab,
 and uses JavaScript Ajax calls that can add both:

 E.g.:
 1. There is a POST  `csrftoken` entry, the middleware tries it, and raises
 CSRF exception, even those there is a valid `X-CSRFToken` header

 Or:
 1. There is a POST  `csrftoken` entry, the middleware tries it, fails...
 2.  Check whether there is a `X-CSRFToken` header, it exists and passes,
 request is okay

 Or.
 1. Tries `X-CSRFToken` header first it exists and passes, request is okay

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33529#comment:7>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/068.87e9d2ec796c709af76aae5cb5fa5a59%40djangoproject.com.

Reply via email to