Django-fr

Forum

  • Accueil
  • » Django-fr
  • » CSRF cookie not set sur le serveur de production et pas en dev.

#1 15-03-2011 22:01:52

Joel Quinet
Membre
Inscription : 11-08-2010
Messages : 21

CSRF cookie not set sur le serveur de production et pas en dev.

Bonsoir,

Je viens de migre un site Django de 1.1.x vers 1.2.5.
J'ai modifié le code pour le CSRF protection, cela fonctionne très bien en
Dev avec le serveur Dev de Django.
Quand j'upload sur mon serveur (webfaction) j'ai l'erreur "CSRF cookie not
set" ?

Comment est-ce possible que ca ne fonctionne plus sur le serveur de
production ?

Joel

Hors ligne

#2 16-03-2011 07:59:28

Nicolas Steinmetz
Membre
Inscription : 11-08-2010
Messages : 96

Re : CSRF cookie not set sur le serveur de production et pas en dev.

Bonjour,

Le 15 mars 2011 22:01, Joel Quinet <joel.quinet _AT_ gmail.com> a écrit :


> Je viens de migre un site Django de 1.1.x vers 1.2.5.
> J'ai modifié le code pour le CSRF protection, cela fonctionne très bien en
> Dev avec le serveur Dev de Django.
> Quand j'upload sur mon serveur (webfaction) j'ai l'erreur "CSRF cookie not
> set" ?
>
> Comment est-ce possible que ca ne fonctionne plus sur le serveur de
> production ?
>

As-tu bien mis à jour ton fichier settings.py pour la déclaration des
middleware ?

Hors ligne

#3 16-03-2011 09:58:21

Jean-mathieu Grimaldi
Membre
Inscription : 12-10-2010
Messages : 17

Re : CSRF cookie not set sur le serveur de production et pas en dev.

Je ne sais pas si c'est en rapport mais sur les uploads en ajax (lorsque le
fichier est dans le corps du post), maintenant il faut ajouter le token dans
le header ''X-CSRFToken'' (obligatoire depuis la 1.2.5). Jusqu'à la 1.2.4,
ça passait sans rien, ce qui était sans doute un trou de sécurité.



Jean-mat


Le 16 mars 2011 07:59, Nicolas Steinmetz <nsteinmetz _AT_ gmail.com> a écrit :

> Bonjour,
>
> Le 15 mars 2011 22:01, Joel Quinet <joel.quinet _AT_ gmail.com> a écrit :
>
>
>
>> Je viens de migre un site Django de 1.1.x vers 1.2.5.
>> J'ai modifié le code pour le CSRF protection, cela fonctionne très bien en
>> Dev avec le serveur Dev de Django.
>> Quand j'upload sur mon serveur (webfaction) j'ai l'erreur "CSRF cookie not
>> set" ?
>>
>> Comment est-ce possible que ca ne fonctionne plus sur le serveur de
>> production ?
>>
>
> As-tu bien mis à jour ton fichier settings.py pour la déclaration des
> middleware ?
>
> --
> Nicolas Steinmetz
> http://www.steinmetz.fr - http://nicolas.steinmetz.fr/
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#4 18-03-2011 10:48:55

Joel Quinet
Membre
Inscription : 11-08-2010
Messages : 21

Re : CSRF cookie not set sur le serveur de production et pas en dev.

Bonjour,

J'ai laissé le fichier settings par default de la version 1.2.5 en ce qui
concerne les middleware
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',
)

Dans les templates, j'ai ajouté : <form action="" method="post">{%
csrf_token %}

Dans les views, j'ai implementé ceci.
@login_required
def index(request):
    c = {}
    c.update(csrf(request))
    if request.method == 'POST':
    ....
    ....
    ....
    return
render_to_response('carnet_de_route/plan_de_missions/grille_d_evaluation/grille_d_evaluation_index.html',
{'form': form}, c)

Je reçois l'exception suivante :
'dict' object has no attribute 'render_context'
lors de l'appel return render_to_response

Il me semble que j'ai implementé de la manière expliquée dans la
documentation....

Joel

Le 16 mars 2011 09:58, Jean-mathieu Grimaldi <jeanmat.grimaldi _AT_ gmail.com> a
écrit :

> Je ne sais pas si c'est en rapport mais sur les uploads en ajax (lorsque le
> fichier est dans le corps du post), maintenant il faut ajouter le token dans
> le header ''X-CSRFToken'' (obligatoire depuis la 1.2.5). Jusqu'à la 1.2.4,
> ça passait sans rien, ce qui était sans doute un trou de sécurité.
>
>
>
> Jean-mat
>
>
> Le 16 mars 2011 07:59, Nicolas Steinmetz <nsteinmetz _AT_ gmail.com> a écrit :
>
>> Bonjour,
>>
>> Le 15 mars 2011 22:01, Joel Quinet <joel.quinet _AT_ gmail.com> a écrit :
>>
>>
>>
>>> Je viens de migre un site Django de 1.1.x vers 1.2.5.
>>> J'ai modifié le code pour le CSRF protection, cela fonctionne très bien
>>> en Dev avec le serveur Dev de Django.
>>> Quand j'upload sur mon serveur (webfaction) j'ai l'erreur "CSRF cookie
>>> not set" ?
>>>
>>> Comment est-ce possible que ca ne fonctionne plus sur le serveur de
>>> production ?
>>>
>>
>> As-tu bien mis à jour ton fichier settings.py pour la déclaration des
>> middleware ?
>>
>> --
>> Nicolas Steinmetz
>> http://www.steinmetz.fr - http://nicolas.steinmetz.fr/
>>
>> _______________________________________________
>> django mailing list
>> django _AT_ lists.afpy.org
>> http://lists.afpy.org/mailman/listinfo/django
>>
>
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#5 18-03-2011 15:38:20

Jean-mathieu Grimaldi
Membre
Inscription : 12-10-2010
Messages : 17

Re : CSRF cookie not set sur le serveur de production et pas en dev.

Inutile de faire quoique ce soit avec le crsf dans une vue standard.
Donc le dico c à la poubelle, il faut passer en contexte
RequestContext qui inclut la protection csrf

from django.template import RequestContext

return render_to_response('my_template.html',
                          my_data_dictionary,
                          context_instance=RequestContext(request))

Plus d'info
http://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext

jean-mat

Le 18 mars 2011 10:48, Joel Quinet <joel.quinet _AT_ gmail.com> a écrit :
>
> Bonjour,
>
> J'ai laissé le fichier settings par default de la version 1.2.5 en ce qui concerne les middleware
> 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',
> )
>
> Dans les templates, j'ai ajouté : <form action="" method="post">{% csrf_token %}
>
> Dans les views, j'ai implementé ceci.
> @login_required
> def index(request):
>     c = {}
>     c.update(csrf(request))
>     if request.method == 'POST':
>     ....
>     ....
>     ....
>     return render_to_response('carnet_de_route/plan_de_missions/grille_d_evaluation/grille_d_evaluation_index.html', {'form': form}, c)
>
> Je reçois l'exception suivante :
> 'dict' object has no attribute 'render_context'
> lors de l'appel return render_to_response
>
> Il me semble que j'ai implementé de la manière expliquée dans la documentation....
>
> Joel
>
> Le 16 mars 2011 09:58, Jean-mathieu Grimaldi <jeanmat.grimaldi _AT_ gmail.com> a écrit :
>>
>> Je ne sais pas si c'est en rapport mais sur les uploads en ajax (lorsque le fichier est dans le corps du post), maintenant il faut ajouter le token dans le header ''X-CSRFToken'' (obligatoire depuis la 1.2.5). Jusqu'à la 1.2.4, ça passait sans rien, ce qui était sans doute un trou de sécurité.
>>
>>
>> Jean-mat
>>
>> Le 16 mars 2011 07:59, Nicolas Steinmetz <nsteinmetz _AT_ gmail.com> a écrit :
>>>
>>> Bonjour,
>>>
>>> Le 15 mars 2011 22:01, Joel Quinet <joel.quinet _AT_ gmail.com> a écrit :
>>>
>>>>
>>>> Je viens de migre un site Django de 1.1.x vers 1.2.5.
>>>> J'ai modifié le code pour le CSRF protection, cela fonctionne très bien en Dev avec le serveur Dev de Django.
>>>> Quand j'upload sur mon serveur (webfaction) j'ai l'erreur "CSRF cookie not set" ?
>>>>
>>>> Comment est-ce possible que ca ne fonctionne plus sur le serveur de production ?
>>>
>>> As-tu bien mis à jour ton fichier settings.py pour la déclaration des middleware ?
>>>
>>> --
>>> Nicolas Steinmetz
>>> http://www.steinmetz.fr - http://nicolas.steinmetz.fr/
>>>
>>> _______________________________________________
>>> django mailing list
>>> django _AT_ lists.afpy.org
>>> http://lists.afpy.org/mailman/listinfo/django
>>
>>
>> _______________________________________________
>> django mailing list
>> django _AT_ lists.afpy.org
>> http://lists.afpy.org/mailman/listinfo/django
>
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#6 18-03-2011 16:07:36

Joel Quinet
Membre
Inscription : 11-08-2010
Messages : 21

Re : CSRF cookie not set sur le serveur de production et pas en dev.

Jean-mathieu,

J'ai effectué les deux modification que tu m'as proposées.
J'ai également ajouté les context processors comme spécifé dans la doc.

TEMPLATE_CONTEXT_PROCESSORS =
("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
#"django.core.context_processors.static",
"django.contrib.messages.context_processors.messages")

Ca fonctionne sur ma machine de Dev avec le serveur de Dev de django mais
quand j'upload sur le serveur webfaction, j'obtiens l'erreur suivante après
avoir introduit mon nom d'utilisateur et mon mot de passe.

Joel


Forbidden (403)

CSRF verification failed. Request aborted.
Help

Reason given for failure:

    CSRF cookie not set.

In general, this can occur when there is a genuine Cross Site Request
Forgery, or when Django's CSRF
mechanism<http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ref-contrib-csrf>
has not been used correctly. For POST forms, you need to ensure:

   - The view function uses
RequestContext<http://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext>
    for the template, instead of Context.
   - In the template, there is a {% csrf_token %} template tag inside each
   POST form that targets an internal URL.
   - If you are not using CsrfViewMiddleware, then you must use csrf_protect
    on any views that use the csrf_token template tag, as well as those that
   accept the POST data.

You're seeing the help section of this page because you have DEBUG = True in
your Django settings file. Change that to False, and only the initial error
message will be displayed.

You can customize this page using the CSRF_FAILURE_VIEW setting.



Le 18 mars 2011 15:38, Jean-mathieu Grimaldi <jeanmat.grimaldi _AT_ gmail.com> a
écrit :

> Inutile de faire quoique ce soit avec le crsf dans une vue standard.
> Donc le dico c à la poubelle, il faut passer en contexte
> RequestContext qui inclut la protection csrf
>
> from django.template import RequestContext
>
> return render_to_response('my_template.html',
>                          my_data_dictionary,
>                          context_instance=RequestContext(request))
>
> Plus d'info
>
> http://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext
>
> jean-mat
>
> Le 18 mars 2011 10:48, Joel Quinet <joel.quinet _AT_ gmail.com> a écrit :
> >
> > Bonjour,
> >
> > J'ai laissé le fichier settings par default de la version 1.2.5 en ce qui
> concerne les middleware
> > 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',
> > )
> >
> > Dans les templates, j'ai ajouté : <form action="" method="post">{%
> csrf_token %}
> >
> > Dans les views, j'ai implementé ceci.
> > @login_required
> > def index(request):
> >     c = {}
> >     c.update(csrf(request))
> >     if request.method == 'POST':
> >     ....
> >     ....
> >     ....
> >     return
> render_to_response('carnet_de_route/plan_de_missions/grille_d_evaluation/grille_d_evaluation_index.html',
> {'form': form}, c)
> >
> > Je reçois l'exception suivante :
> > 'dict' object has no attribute 'render_context'
> > lors de l'appel return render_to_response
> >
> > Il me semble que j'ai implementé de la manière expliquée dans la
> documentation....
> >
> > Joel
> >
> > Le 16 mars 2011 09:58, Jean-mathieu Grimaldi <jeanmat.grimaldi _AT_ gmail.com>
> a écrit :
> >>
> >> Je ne sais pas si c'est en rapport mais sur les uploads en ajax (lorsque
> le fichier est dans le corps du post), maintenant il faut ajouter le token
> dans le header ''X-CSRFToken'' (obligatoire depuis la 1.2.5). Jusqu'à la
> 1.2.4, ça passait sans rien, ce qui était sans doute un trou de sécurité.
> >>
> >>
> >> Jean-mat
> >>
> >> Le 16 mars 2011 07:59, Nicolas Steinmetz <nsteinmetz _AT_ gmail.com> a écrit
> :
> >>>
> >>> Bonjour,
> >>>
> >>> Le 15 mars 2011 22:01, Joel Quinet <joel.quinet _AT_ gmail.com> a écrit :
> >>>
> >>>>
> >>>> Je viens de migre un site Django de 1.1.x vers 1.2.5.
> >>>> J'ai modifié le code pour le CSRF protection, cela fonctionne très
> bien en Dev avec le serveur Dev de Django.
> >>>> Quand j'upload sur mon serveur (webfaction) j'ai l'erreur "CSRF cookie
> not set" ?
> >>>>
> >>>> Comment est-ce possible que ca ne fonctionne plus sur le serveur de
> production ?
> >>>
> >>> As-tu bien mis à jour ton fichier settings.py pour la déclaration des
> middleware ?
> >>>
> >>> --
> >>> Nicolas Steinmetz
> >>> http://www.steinmetz.fr - http://nicolas.steinmetz.fr/
> >>>
> >>> _______________________________________________
> >>> django mailing list
> >>> django _AT_ lists.afpy.org
> >>> http://lists.afpy.org/mailman/listinfo/django
> >>
> >>
> >> _______________________________________________
> >> django mailing list
> >> django _AT_ lists.afpy.org
> >> http://lists.afpy.org/mailman/listinfo/django
> >
> >
> > _______________________________________________
> > django mailing list
> > django _AT_ lists.afpy.org
> > http://lists.afpy.org/mailman/listinfo/django
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#7 18-03-2011 18:19:54

Jean-mathieu Grimaldi
Membre
Inscription : 12-10-2010
Messages : 17

Re : CSRF cookie not set sur le serveur de production et pas en dev.

Bizarre, vérifie le settings.py sur le site de prod, idem pour la
version de django (bien sûr que c'est identique ?)
Vérifie tes cookies côté client (effaces les cookies, et regarde ce
qui se passe avec firebug par exemple, le cookie 'csrftoken' doit être
en place dés la 1ere connexion au site)

Difficile d'en dire plus, il peut y avoir des tas de raisons, je
connais pas webfaction.

Bon week-end

Le 18 mars 2011 16:07, Joel Quinet <joel.quinet _AT_ gmail.com> a écrit :
> Jean-mathieu,
>
> J'ai effectué les deux modification que tu m'as proposées.
> J'ai également ajouté les context processors comme spécifé dans la doc.
>
> TEMPLATE_CONTEXT_PROCESSORS =
> ("django.contrib.auth.context_processors.auth",
> "django.core.context_processors.debug",
> "django.core.context_processors.i18n",
> "django.core.context_processors.media",
> #"django.core.context_processors.static",
> "django.contrib.messages.context_processors.messages")
>
> Ca fonctionne sur ma machine de Dev avec le serveur de Dev de django mais
> quand j'upload sur le serveur webfaction, j'obtiens l'erreur suivante après
> avoir introduit mon nom d'utilisateur et mon mot de passe.
>
> Joel
>
>
> Forbidden (403)
>
> CSRF verification failed. Request aborted.
>
> Help
>
> Reason given for failure:
>
>     CSRF cookie not set.
>
>
> In general, this can occur when there is a genuine Cross Site Request
> Forgery, or when Django's CSRF mechanism has not been used correctly. For
> POST forms, you need to ensure:
>
> The view function uses RequestContext for the template, instead of Context.
> In the template, there is a {% csrf_token %} template tag inside each POST
> form that targets an internal URL.
> If you are not using CsrfViewMiddleware, then you must use csrf_protect on
> any views that use the csrf_token template tag, as well as those that accept
> the POST data.
>
> You're seeing the help section of this page because you have DEBUG = True in
> your Django settings file. Change that to False, and only the initial error
> message will be displayed.
>
> You can customize this page using the CSRF_FAILURE_VIEW setting.
>
>
> Le 18 mars 2011 15:38, Jean-mathieu Grimaldi <jeanmat.grimaldi _AT_ gmail.com> a
> écrit :
>>
>> Inutile de faire quoique ce soit avec le crsf dans une vue standard.
>> Donc le dico c à la poubelle, il faut passer en contexte
>> RequestContext qui inclut la protection csrf
>>
>> from django.template import RequestContext
>>
>> return render_to_response('my_template.html',
>>                          my_data_dictionary,
>>                          context_instance=RequestContext(request))
>>
>> Plus d'info
>>
>> http://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext
>>
>> jean-mat
>>
>> Le 18 mars 2011 10:48, Joel Quinet <joel.quinet _AT_ gmail.com> a écrit :
>> >
>> > Bonjour,
>> >
>> > J'ai laissé le fichier settings par default de la version 1.2.5 en ce
>> > qui concerne les middleware
>> > 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',
>> > )
>> >
>> > Dans les templates, j'ai ajouté : <form action="" method="post">{%
>> > csrf_token %}
>> >
>> > Dans les views, j'ai implementé ceci.
>> > @login_required
>> > def index(request):
>> >     c = {}
>> >     c.update(csrf(request))
>> >     if request.method == 'POST':
>> >     ....
>> >     ....
>> >     ....
>> >     return
>> > render_to_response('carnet_de_route/plan_de_missions/grille_d_evaluation/grille_d_evaluation_index.html',
>> > {'form': form}, c)
>> >
>> > Je reçois l'exception suivante :
>> > 'dict' object has no attribute 'render_context'
>> > lors de l'appel return render_to_response
>> >
>> > Il me semble que j'ai implementé de la manière expliquée dans la
>> > documentation....
>> >
>> > Joel
>> >
>> > Le 16 mars 2011 09:58, Jean-mathieu Grimaldi
>> > <jeanmat.grimaldi _AT_ gmail.com> a écrit :
>> >>
>> >> Je ne sais pas si c'est en rapport mais sur les uploads en ajax
>> >> (lorsque le fichier est dans le corps du post), maintenant il faut ajouter
>> >> le token dans le header ''X-CSRFToken'' (obligatoire depuis la 1.2.5).
>> >> Jusqu'à la 1.2.4, ça passait sans rien, ce qui était sans doute un trou de
>> >> sécurité.
>> >>
>> >>
>> >> Jean-mat
>> >>
>> >> Le 16 mars 2011 07:59, Nicolas Steinmetz <nsteinmetz _AT_ gmail.com> a écrit
>> >> :
>> >>>
>> >>> Bonjour,
>> >>>
>> >>> Le 15 mars 2011 22:01, Joel Quinet <joel.quinet _AT_ gmail.com> a écrit :
>> >>>
>> >>>>
>> >>>> Je viens de migre un site Django de 1.1.x vers 1.2.5.
>> >>>> J'ai modifié le code pour le CSRF protection, cela fonctionne très
>> >>>> bien en Dev avec le serveur Dev de Django.
>> >>>> Quand j'upload sur mon serveur (webfaction) j'ai l'erreur "CSRF
>> >>>> cookie not set" ?
>> >>>>
>> >>>> Comment est-ce possible que ca ne fonctionne plus sur le serveur de
>> >>>> production ?
>> >>>
>> >>> As-tu bien mis à jour ton fichier settings.py pour la déclaration des
>> >>> middleware ?
>> >>>
>> >>> --
>> >>> Nicolas Steinmetz
>> >>> http://www.steinmetz.fr - http://nicolas.steinmetz.fr/
>> >>>
>> >>> _______________________________________________
>> >>> django mailing list
>> >>> django _AT_ lists.afpy.org
>> >>> http://lists.afpy.org/mailman/listinfo/django
>> >>
>> >>
>> >> _______________________________________________
>> >> django mailing list
>> >> django _AT_ lists.afpy.org
>> >> http://lists.afpy.org/mailman/listinfo/django
>> >
>> >
>> > _______________________________________________
>> > django mailing list
>> > django _AT_ lists.afpy.org
>> > http://lists.afpy.org/mailman/listinfo/django
>> _______________________________________________
>> django mailing list
>> django _AT_ lists.afpy.org
>> http://lists.afpy.org/mailman/listinfo/django
>
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

  • Accueil
  • » Django-fr
  • » CSRF cookie not set sur le serveur de production et pas en dev.

Pied de page des forums