#28488: Django 1.11 to 1.11.4 raises CSRF verification failed if settings.DEBUG is False -------------------------------------+------------------------------------- Reporter: Ruben Alves | Owner: nobody Type: Bug | Status: new Component: CSRF | Version: 1.11 Severity: Release blocker | Resolution: Keywords: csrf failed | Triage Stage: settings debug false production | Unreviewed Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+-------------------------------------
Comment (by Ruben Alves): I finally solved my problem. The problem is: If a user just get a `404` page, a new `CSRF Token` is generated, invalidating the `CSRF Token` that was originally loaded with `{% csrf_token %}`. **How I've discovered** On the WebSite that I work, we have a page with the URI `/en/courses/`. On that page, on the `.html` file we include a JavaScript: `<script src="/static/js/app.js"></script>` The `app.js` was trying to load a file named `assets/js/particles.json` using the relative path, so the final URL of the static file was `/en/courses/assets/js/particles.json`. Load the `particles.json` is the only thing that `app.js` was doing. Nothing else. That `particles.json` doesn't exist on our system. After successfully load `/en/courses/`, the Django Server was receiving a request for `/en/courses/assets/js/particles.json` that raises a `404` error for the static file, but this error `404` is not even noticed by the users because this JS file was doing nothing. After I remove this `<script src="/static/js/app.js"></script>`, everything worked fine. Then with debugs on the `django.middleware.csrf.CsrfViewMiddleware` I could confirm that if I reload a page 1000 times, the `CSRF Token` returned by `_unsalt_cipher_token` (https://github.com/django/django/blob/stable/1.11.x/django/middleware/csrf.py#L62) is always the same. But if I just try to access a page that doesn't exist, then `_unsalt_cipher_token` returns a different value (a new token is generated). Unbelievable that a single `javascript` that doesn't even exist has broken my system and took me 3 days to find out. -- Ticket URL: <https://code.djangoproject.com/ticket/28488#comment:12> 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 post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/068.787bdda637744e298af6e7ca390663eb%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.