tutorial - how to use django with python




Django-Falló la verificación de CSRF (2)

Recibo un mensaje de error de verificación de CSRF al intentar crear un formulario simple a partir de un tutorial. Investigué un poco sobre qué es la verificación de CSRF, y que yo sepa, para usarlo necesitas una de esas etiquetas csrf_token en tu html, pero no tengo esa

Aquí está mi plantilla:

<form action="/testapp1/contact/" method="post">
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>

Bastante sencillo, ubicado en contact.html

Aquí está mi urlconf: de django.conf.urls.defaults import *

urlpatterns=patterns('testapp1.views',
    (r'^$', 'index'),
    (r'^contact/$','contact')
)

El nombre de la aplicación es testapp1. Cuando escribo mi url (http: // localhost: 8000 / testapp1 / contact), voy correctamente al formulario. Luego, cuando envío el formulario, obtengo el error de verificación.

Esta es mi opinión, aunque no creo que sea relevante:

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            subject = form.cleaned_data['subject']
            message = form.cleaned_data['message']
            sender = form.cleaned_data['sender']
            cc_myself = form.cleaned_data['cc_myself']
            recipients = ['[email protected]']
            if cc_myself:
                recipients.append(sender)
            print 'Sending Mail:'+subject+','+message+','+sender+','+recipients
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })

La solución

1 . incluya {% csrf_token %} dentro de la etiqueta del formulario en la plantilla.

2 . si por algún motivo está utilizando render_to_response en Django 1.3 y superior, reemplácelo con la función de render . Reemplace esto:

# Don't use this on Django 1.3 and above
return render_to_response('contact.html', {'form': form})

Con este:

return render(request, 'contact.html', {form: form})

La función de render se introdujo en la versión 1.3 de Django . Si está utilizando una versión antigua como 1.2 o inferior , debe usar render_to_response con un RequestContext :

# Deprecated since version 2.0
return render_to_response('contact.html', {'form': form},
                   context_instance=RequestContext(request))

¿Qué es la protección CSRF y por qué la quiero?

Es un ataque en el que un enemigo puede obligar a los usuarios a hacer cosas desagradables, como transferir fondos, cambiar su dirección de correo electrónico, etc.

La Falsificación de solicitudes entre sitios (CSRF) es un ataque que obliga al usuario final a ejecutar acciones no deseadas en una aplicación web en la que está autenticado actualmente. Los ataques CSRF se dirigen específicamente a las solicitudes que cambian el estado, no al robo de datos, ya que el atacante no tiene forma de ver la respuesta a la solicitud falsificada. Con un poco de ayuda de ingeniería social (como enviar un enlace por correo electrónico o chat), un atacante puede engañar a los usuarios de una aplicación web para que ejecuten las acciones que el atacante elija. Si la víctima es un usuario normal, un ataque CSRF exitoso puede obligar al usuario a realizar solicitudes de cambio de estado, como transferir fondos, cambiar su dirección de correo electrónico, etc. Si la víctima es una cuenta administrativa, CSRF puede comprometer toda la aplicación web. Fuente: Proyecto de seguridad de aplicaciones web abiertas

Incluso si no le importa este tipo de cosas ahora la aplicación puede crecer, por lo que la mejor práctica es mantener la protección CSRF.

¿No debería la protección CSRF ser opcional?

Es opcional pero está activado por defecto (el middleware CSRF está incluido por defecto). Puedes apagarlo:

  • para una vista particular adornando con el decorador csrf_excempt .
  • para cada vista, eliminando el middleware CSRF de la lista de middleware en settings.py

Si lo desactivas en todo el sistema, puedes activarlo para una vista particular decorándolo con el decorador csrf_protect .


Para Django 1.4

settings.py

MIDDLEWARE_CLASSES = (
...
'django.middleware.csrf.CsrfViewMiddleware',
)

view.py

from django.template.defaulttags import csrf_token
from django.shortcuts import render

@csrf_token
def home(request):
    """home page"""
    return render(request,
        'template.html',
            {}
    )

template.html

<form action="">
    {% csrf_token %}
....
</form>




django