2012-03-13 218 views
31

Estoy siguiendo Django 1.3 Desarrollo web. y para los inicios de sesión, obtengo el siguiente errorFalló la verificación de CSRF. Solicitud abortada en django

Forbidden (403) 
CSRF verification failed. Request aborted. 
Help 
Reason given for failure: 
    CSRF token missing or incorrect. 

Esta es mi settings.py APPS incluidas. Es exactamente como el libro dice que debería ser.

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    # Uncomment the next line to enable the admin: 
    'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
    'djangocricket.Cricket', 
    'djangocricket.cms' 
) 

El libro dice, debe contener, django.contrib.auth.views.login .. y estoy incluyendo en

urlpatterns = patterns('', 
    # Examples: 
    url(r'^$', 'djangocricket.Cricket.views.index', name='default'), 
    url(r'^user/(\w+)/$', 'djangocricket.Cricket.views.user_home', name='user home'), 
    url(r'^login/$', 'django.contrib.auth.views.login'), 
    # url(r'^djangocricket/', include('djangocricket.foo.urls')), 

    # Uncomment the admin/doc line below to enable admin documentation: 
    #url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 

    # Uncomment the next line to enable the admin: 
    url(r'^news/', 'djangocricket.cms.views.index', name='index'), 
    #url(r'^news/(?P<slug>[^\.]+).html', 'djangocricket.cms.views.detail', name='get_single_news_item'), 
    url(r'^admin/', include(admin.site.urls)), 
) 

y mi registro/login.html ... copia pegado del libro. debería hacer.

<html> 
<head> 
    <title>Django Bookmarks - User Login</title> 
</head> 
<h1>User Login</h1> 
{% if form.errors %} 
    <p>Your username and password didn't match. 
     Please try again.</p> 
{% endif %} 
<form method="post" action="."> 
    <p><label for="id_username">Username:</label> 
     {{ form.username }}</p> 
    <p><label for="id_password">Password:</label> 
     {{ form.password }}</p> 
    <input type="hidden" name="next" value="/" /> 
    <input type="submit" value="login" /> 
</form> 
</body> 
</html> 

¿Qué me falta?

Respuesta

52

Debe agregar la etiqueta de la plantilla {% csrf_token %} como elemento secundario del elemento form en su plantilla de Django.

De esta manera, la plantilla representará un elemento oculto con el valor establecido en el token CSRF. Cuando el servidor de Django recibe la solicitud de formulario, Django verificará que el token coincida con el valor que se procesó en el formulario. Esto es necesario para garantizar que las solicitudes POST (es decir, las solicitudes que modifican datos) se originen en una sesión de cliente auténtica.

Para obtener más información, consulte la documentación de Django en: https://docs.djangoproject.com/en/dev/ref/csrf/

He aquí un resumen de la Cruz-Sitio ataque Falsificación de Petición: https://www.owasp.org/index.php/CSRF

+0

gracias, esto ayuda. – debuggerpk

+3

gracias por el enlace –

7

Si utiliza csrf_token etiqueta de plantilla, pero no cambia nada, marca CSRF_COOKIE_DOMAIN configuración. Debe establecer None en el entorno de desarrollo.

+2

Compruebe 'CSRF_COOKIE_SECURE' también si su servidor de desarrollo no tiene ssl. – Mark

4

Solo quería dar información adicional sobre el tema. Si alguna vez le sucede a usted y está seguro de que el token se inyectó en el formulario y las funciones de vista lo están manejando todo correctamente, el problema persiste. Asegúrese de que no haya código javascript que deshabilite los campos de entrada. Me sucedió, después de varias horas de depuración, finalmente me di cuenta de eso.

<input type="hidden" name="csrfmiddlewaretoken" value="pHK2CZzBB323BM2Nq7DE2sxnQoBG1jPl" disabled=""> 
+0

Buen punto; los valores de los elementos de formulario 'disabled 'no se envían al servidor cuando se envía el formulario. –

5

Tuve el mismo problema. Resolví este problema cuando agregué el {% csrf_token%}. Finalmente mi código es la siguiente:

<form id='formulario2' method='post' action='> 
     <h3>Enter:</h3> 
     {% csrf_token %} 


    <input id="id_mesaje" name="mesaje" type="email" placeholder="E-mail"/> 
    <input type='submit' name="boton2" value='Suscribete' style="display:inline-block;background-color: #80e174; "/> 
</form> 
0

Hola simplemente utilizar {%}% csrf_token dentro de sus form.This trabajaron para mí. Entonces, ¿por qué usamos la falsificación solicitada en Cross-site? Bueno, la respuesta es bastante simple: acaba de agregar otra capa de seguridad a su página web, mediante la cual cualquier usuario malintencionado no puede validar una solicitud utilizando un token equivocado.

Cuestiones relacionadas