Pregunta

Estoy recibiendo muchos errores desde el CSRF Django middleware en mi sitio (la versión de SVN.) Los únicos errores que me dan son:CSRF error:razón=token CSRF falta o es incorrecta.

¿Cómo podría diagnosticar donde estas CSRF errores están viniendo?Yo no puede causar el CSRF errores de mí, pero puedo configurar el sitio para enviarme un correo electrónico cada vez que el CSRF vista de error se activa así que sé de lo que está sucediendo a menudo.

¿Fue útil?

Solución

Me esforcé para hacerlo bien, pero al final lo hizo. Aquí fueron mis principales cuestiones (Django 1.2 beta):

  1. Asegúrese de que su materia middleware es correcto, de acuerdo a la versión de Django que está utilizando. Esto está bien cubierto en la literatura de Django en línea.
  2. Asegúrese de que usted tiene la {%}% csrf_token en cada forma, justo después de la etiqueta de apertura de la forma
  3. Esta fue mi principal problema, asegúrese de que todas sus formas tienen un go-to de la página, es decir, no hacen action = "" en su formulario.
  4. Asegúrese de que los ajustes de mensajes de correo electrónico son los más adecuados. 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 = 'passwd' EMAIL_PORT = '26' # menudo parece ser de 25 o 26 en muchos de los mensajes en el foro he leído DEFAULT_FROM_EMAIL='noreply@domain.com' # en los dominios alojados, asegúrese de que está configurado y enviar SERVER_EMAIL = 'noreply@domain.com' # Igual que el anterior correo electrónico

    1. Agregue el request_context hasta el final de su render_to_response

    render_to_response retorno ( 'contact.htm', { 'favicon': r '____ ico',                                    'mas cosas':"......"                                    'mas cosas':"......"                                    'mas cosas':"......"                                       },                        context_instance = RequestContext (request))

Asegúrate de que tienes:

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

en su archivo settings.py.

Tenga en cuenta que esto no es realmente una forma de, esto es justo lo que hice para conseguir mina de trabajo. La razón por publicar ahora es que veo a tanta gente en los foros de discusión de este tema complejo a tan sólo girando el csrf_token fuera.

Otros consejos

Un error de CSRF debería ocurrir cuando el middleware se detiene con éxito un ataque Falsificación de Petición Cross Site. Probablemente la mejor manera de verificar que este es el caso para revisar sus registros del servidor web y debería ver las solicitudes que no están relacionados con una solicitud anterior.

También se debe comprobar el orden de la 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 era la instancia RequestContext y el orden.

Asegúrese de que la función de vista 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>)

A continuación, comprobar 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' />

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top