python - tutorial - Django-Falló la verificación de CSRF
django windows (3)
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
.
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,
})
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>
views.py:
from django.shortcuts import render_to_response
from django.template import RequestContext
def my_view(request):
return render_to_response(''mytemplate.html'', context_instance=RequestContext(request))
mytemlate.html:
<form action="/someurls/" method="POST">{% csrf_token %}