2012-08-05 10 views
5

Nous avons un petit site qui commence à peine à être exposé au monde extérieur. Pour la plupart, cela fonctionne très bien, mais nous obtenons parfois des erreurs 403 avec le message "CSRF FAILURECSRF cookie not set" de l'un des formulaires. La forme a certainement le inclus {% csrf_token %}, et notre middleware ressemble à ceci:Sporadic 403 "cookie CSRF FAILURECSRF non réglé" erreurs avec django

MIDDLEWARE_CLASSES = (
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 

La forme fonctionne très bien pour la plupart des gens, mais environ une fois par jour, je reçois un e-mail avec un cas d'échec. Le courrier électronique comprend la demande réelle, qui ressemble à ceci (je l'ai enlevé le reste des données POST pour cacher des données privées, mais a quitté le csrfmiddlewaretoken):

<WSGIRequest 
path:/main/10/apply/, 
GET:<QueryDict: {}>, 
POST:<QueryDict: {u'csrfmiddlewaretoken': [u'IQQZvbVIggJm6Be6VinPHj8Qn3i3TdmG']}>, 
COOKIES:{}, 
META:{'CONTENT_LENGTH': '111978', 
'CONTENT_TYPE': 'multipart/form-data; boundary=----WebKitFormBoundaryLyo9BPXnAwKnt8ew', 
'CSRF_COOKIE': 'XmSPWJZk2UwS4PNBXRmVlAaYDDdNaGqk', 

Le CSRF_COOKIE ne correspond pas au csrfmiddlewaretoken , ce que je suppose est à l'origine du problème, mais je n'arrive pas à comprendre comment ils sont désynchronisés pour certaines soumissions, mais pas pour d'autres. La page est une forme assez simple avec seulement quelques champs.

Des suggestions pour où je devrais regarder? Je cours le dernier Django 1.4.1 sur CentOS en utilisant mod_wsgi via apache.

Edit: La seule autre chose qui semble étrange par rapport aux demandes de succès est que ici la section COOKIES:{} est vide, ce qui me conduirait à penser que peut-être ils ont juste désactivé les cookies dans leur navigateur, mais alors pourquoi il apparaît avec le CSRF_COOKIE dans la section META?

Merci pour votre aide!

Brandon

+0

Je suis confronté exactement à ce même problème. Avez-vous déjà trouvé une solution? –

+0

Trier par. Le problème était que certains utilisateurs avaient des cookies désactivés, et il n'y a aucun moyen de résoudre ce problème du côté serveur. Nous avons fini par désactiver la protection CSRF pour le formulaire destiné au public. Ne faites pas cela pour les pages de connexion ou d'autres données sensibles, mais la protection CSRF n'est pas toujours strictement nécessaire. – brandon

Répondre

0

HTTP_COOKIE est également vide?

Il pourrait être le django ne voit pas un cookie jeton CSRF dans la demande, et il génère un nouveau CSRF_COOKIE et en le mettant dans meta.

Questions connexes