Django - Interdit (CSRF cookie non défini.)
J'ai un Django site web avec des moyennes de trafic (environ 4000/5000 visites par jour). Aujourd'hui, j'ai configuré la "JOURNALISATION" option settings.py pour envoyer un e-mail avec "Info", il suffit de vérifier si tout était ok...
Il y a ma grande surprise, je reçois le message d'erreur suivant:
[Django] AVERTISSEMENT (IP EXTERNE): Interdit (CSRF cookie non défini.)
No stack trace available
<WSGIRequest
path:/cadastro/usuario/,
GET:<QueryDict: {}>,
POST:<QueryDict: {**xxxxxxx (some varibles....) and**: u'csrfmiddlewaretoken': [u'4wqRKQXZsTmXJaOkCsGobWyG1rzihc8x'], }>,
COOKIES:{},
META:{'CONTENT_LENGTH': '381',
'CONTENT_TYPE': 'application/x-www-form-urlencoded',
'CSRF_COOKIE': 'qzc4i7JdHoQLJ8N5aI9MTlamOZMOKmP0',
'DOCUMENT_ROOT': '/opt/nginx/html',
'HTTP_ACCEPT': 'text/html, application/xhtml+xml, */*',
'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
'HTTP_ACCEPT_LANGUAGE': 'pt-BR',
'HTTP_CACHE_CONTROL': 'no-cache',
'HTTP_CONNECTION': 'Keep-Alive',
'HTTP_CONTENT_LENGTH': '381',
'HTTP_CONTENT_TYPE': 'application/x-www-form-urlencoded',
'HTTP_HOST': 'xxxxxx',
'HTTP_REFERER': 'http://xxxx/y/z',
'HTTP_USER_AGENT': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)',
'PATH_INFO': u'/y/z',
'QUERY_STRING': '',
'REMOTE_ADDR': '187.27.35.123',
'REMOTE_PORT': '54221',
'REQUEST_METHOD': 'POST',
'REQUEST_URI': 'y/z',
'SCRIPT_NAME': u'',
'SERVER_NAME': 'xxxxxxx',
'SERVER_PORT': '80',
'SERVER_PROTOCOL': 'HTTP/1.1',
'uwsgi.version': '0.9.6.5',
'wsgi.errors': <open file 'wsgi_input', mode 'w' at 0xa126338>,
'wsgi.file_wrapper': <built-in function uwsgi_sendfile>,
'wsgi.input': <open file 'wsgi_input', mode 'r' at 0xa126a70>,
'wsgi.multiprocess': True,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'http',
'wsgi.version': (1, 0)}>
J'ai essayé de reproduire cette erreur, mais je ne pourrais pas. Je l'ai tester sur Firefox et Chrome, nettoyé tous les cookies... Tout va bien. Mais j'obtiens cette erreur une douzaine de fois, toujours avec des IP différentes, donc je suppose que ce n'est pas une attaque... Tout mon formulaire a {% csrf_token %} et django.middleware.csrf.CsrfViewMiddleware est configuré sur MIDDLEWARE_CLASSES.
Le message de journal ci-dessus est très clair que CSRF_COOKIE n'est pas vide. Je suis à l'aide de Django 1.4.
[Mise à JOUR]
Je Pense que ces utilisateurs n'ont pas activé les cookies...
Donc... Le problème est: Comment utiliser CSRF avec des utilisateurs qui n'ont pas activé les cookies?
Bonjour Jdi, variable POST, je peux voir que c'est un utilisateur valide (pas un robot). Si le client n'avez pas de cookie activer le "CSRF_COOKIE" wouldnt être vide?
Jdi, j'ai juste fait ce test ici... j'ai enlevé CSRF_COOKIE avec firecookie et je reçois le message d'erreur. Je ne suis pas sûr si c'est le problème parce que je reçois beaucoup d'erreurs comme ça, mais savez-vous comment puis-je signaler à l'utilisateur d'activer les cookies?
Peut-être un javascript test? forums.asp.net/t/1149145.aspx/1
Je suis en train de chercher une autre solution, quelqu'un aurait-il une idée?
OriginalL'auteur Thomas | 2012-04-22
Vous devez vous connecter pour publier un commentaire.
Comme je l'avais mentionné dans mon premier commentaire, vous verrez que l'erreur lorsqu'une 403 est déclenché en raison d'une CSRF échec.
Vous ne devriez pas avoir à vous soucier de tenter de gérer la protection CSRF à l'encontre des utilisateurs sans les cookies. La nature même d'une attaque CSRF nécessite l'utilisation de cookies de votre navigateur. Si ils ne sont pas utilisés, les CSRF protégés demande échoue (comme vous l'avez vu). Ainsi, vous êtes toujours protégé.
Django permet de définir un point de vue spécifique à utiliser pour le client dans le cas d'une CSRF échec: https://docs.djangoproject.com/en/dev/ref/settings/#std%3asetting-CSRF_FAILURE_VIEW
Vraiment, vous ne devriez pas avoir besoin de faire autre chose que remarque qu'il y a des demandes qui sont essayez de POSTER votre serveur dans un invalide.
OriginalL'auteur jdi