2012-08-05 10 views
5

Tenemos un sitio pequeño que está comenzando a estar expuesto al mundo exterior. En su mayor parte, está funcionando muy bien, pero ocasionalmente obtenemos errores 403 con el mensaje "CSRF FAILURECSRF Cookie not set" de uno de los formularios. La forma definitivamente tiene la {% csrf_token %} incluido, y nuestro middleware se ve así:Error esporádico de 403 "CSRF FAILURECSRF cookie no establecida" con 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', 
) 

forma funciona bien para la mayoría de la gente, pero una vez al día que recibe un correo electrónico con un caso de fracaso. El correo electrónico incluye la solicitud real, que se parece a esto (he quitado el resto de los datos POST para ocultar los datos privados, pero dejó la 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', 

la CSRF_COOKIE no coincide con el csrfmiddlewaretoken , que es lo que supongo que está causando el problema, pero no puedo entender cómo estos no están sincronizados para algunos envíos, pero no para otros. La página es una forma bastante simple con solo unos pocos campos.

¿Alguna sugerencia de dónde debería buscar? Estoy ejecutando el último Django 1.4.1 en CentOS usando mod_wsgi a través de apache.

Editar: La única otra cosa que parece extraño en comparación con las peticiones de éxito es que aquí la sección COOKIES:{} está vacía, lo que me llevaría a sospechar que tal vez lo único que tienen desactivado las cookies en su navegador, pero entonces ¿por qué aparece con CSRF_COOKIE en la sección META?

Gracias por su ayuda!

Brandon

+0

Me encuentro con este mismo problema exacto. ¿Alguna vez descubrió una solución? –

+0

tipo de. El problema era que algunos usuarios tenían las cookies desactivadas, y no hay forma de solucionar eso desde el lado del servidor. Terminamos desactivando la protección CSRF para el formulario público. No haga esto para páginas de inicio de sesión u otros datos confidenciales, pero la protección CSRF no siempre es estrictamente necesaria. – brandon

Respuesta

0

¿HTTP_COOKIE también está en blanco?

Podría ser que el django no vea una cookie de token CSRF en la solicitud y está generando un nuevo CSRF_COOKIE y ponerlo en meta.