2009-11-19 9 views
6

Recibo muchas fallas del middleware CSRF Django en mi sitio (la versión del trunk SVN). Los únicos errores que recibo son: CSRF failure: reason = CSRF token missing or incorrect.Framework Django CSRF que tiene muchas fallas

¿Cómo podría diagnosticar de dónde vienen estos errores CSRF? No puedo causar los errores CSRF yo mismo, pero configuro el sitio para que me envíe un correo electrónico siempre que se active la vista de error CSRF, así sé que está sucediendo a menudo.

Respuesta

15

Realmente tuve problemas para hacerlo bien, pero finalmente lo hice. Aquí estaban mis principales problemas (Django 1.2 beta):

  1. Asegúrate de que tus cosas de middleware estén correctas, de acuerdo con la versión de Django que estés usando. Esto está bien cubierto en la literatura de Django en línea.
  2. Asegúrese de tener el {% csrf_token%} en cada formulario, solo siguiendo la etiqueta de apertura para el formulario
  3. Este fue mi problema principal, asegúrese de que todos sus formularios tengan una página de inicio, es decir, don no haga acción = "" en su forma.
  4. Asegúrese de que los correos electrónicos de configuración sean los correctos. Tenía que hacer algo como esto:

    EMAIL_HOST = 'mail.my-domain.com' EMAIL_HOST_USER = 'mi nombre de usuario en el servidor' EMAIL_HOST_PASSWORD = 'password' EMAIL_PORT = '26' # a menudo parece tener 25 o 26 en muchas de las publicaciones del foro que leo DEFAULT_FROM_EMAIL='[email protected] '# en dominios alojados, asegúrese de que esté configurado y envíe SERVER_EMAIL =' [email protected] '# Mismo correo electrónico que el anterior

    1. Añadir la request_context hasta el final de su render_to_response

    return render_to_response ('contact.htm', {'favicon': r '____. Ico', 'more_stuff': "......" 'more_stuff': "......" 'more_stuff': "......" }, context_instance = RequestContext (petición))

Asegúrese de que usted tiene:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.csrf", 
    ..... 
    ) 

en su settings.py archivo.

Tenga en cuenta que esto realmente no es una manera de hacerlo, esto es solo lo que hice para que el mío funcione. La razón para publicarlo ahora es que veo tanta gente en los foros que discuten sobre este tema recurrir a simplemente apagar el csrf_token.

+0

Probé todo aquí, sin suerte. Por lo que puedo decir, estoy haciendo todo por el libro. (Django 1.3). Alguien más tiene alguna otra idea? He desactivado el CSFR por el momento. – araneae

+0

Tengo problemas similares y tengo direcciones URL de acción vacías en muchas formas. Por interés, ¿cuál es la razón por la cual esto causa un problema? Puedo ver aquí: http://stackoverflow.com/questions/1131781/is-it-a-good-practice-to-use-an-empty-url-for-a-html-forms-action-attribute-a que no está en la especificación, pero me pregunto por qué causa un problema? – bjw

+0

Además, @araneae Desactivar la protección crsf sin una buena razón es una mala idea, y este comentario podría llevar a otros a hacer lo mismo. El único caso en el que puedo ver que es necesario desactivarlo es para algunos escenarios de Ajax, y quizás también para tomar datos POST de API de terceros como Twilio. – bjw

2

Un error CSRF debe ocurrir cuando el middleware detiene con éxito un ataque de falsificación de solicitud entre sitios. Probablemente la mejor manera de verificar que este sea el caso, verifique los registros de su servidor web y vea las solicitudes que no están relacionadas con una solicitud anterior.

+0

Parece que tengo errores de CSRF en todas las páginas públicas que hacen una publicación y no tienen la clave especial. Mi solución fue utilizar el decorador disable_csrf en todas las vistas públicas. – MikeN

0

Asegúrese de que el punto de vista de la función de solicitud GET se ve así:

def login_view(): 
c = {} 
c.update(csrf(request)) 
request.session.set_expiry(0) 
if request.method == 'GET': 
    return render_to_response('newform.html',<b>c</b>) 

continuación, compruebe la fuente de la visión para su newform.html, debe tener Campo oculto.

<`form action="" method="post" name="loginform"> <`div style='display:none'`><`input type='hidden' name='csrfmiddlewaretoken' value='6f4dee99ab2f5e7201e057cb63' /> 

Aquí, la acción se puede referir la misma página, action="".

1

También debe verificar el orden de MIDDLEWARE_CLASSES en su archivo settings.py. Debe ser algo como esto:

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

LocaleMiddleware al final. Para mí, la solución fue la instancia RequestContext y el pedido.