2010-08-25 6 views
5

Les formulaires utilisant la méthode POST doivent-ils avoir la protection CSRF? Je suis un livre et les exemples de code jettent 403 erreurs. J'ai fait quelques recherches et il semble que je devrais activer CSRF dans toutes mes formes.Django: le formulaire POST nécessite CSRF? GET ne pas?

Mes questions sont les suivantes:

  1. Est-ce que Django exige maintenant que toutes les formes de POST soient protégés contre les CSRF?

  2. Tout ce que je dois faire pour y arriver est d'ajouter 'django.middleware.csrf.CsrfViewMiddleware', retour render_to_response (modèle, dictionnaire, context_instance = RequestContext (demande), et ajouter '{% csrf_token%} dans le forme? suis-je manque quelque chose ici?

Quand je fais cela, la forme correspondante fonctionne très bien. Lorsque l'une de ces pièces sont manquantes, il ne parvient pas à 403. Je veux juste assurer que je fais DROIT. :)

Merci d'avance.

modifier:

Pour une raison quelconque ce code n'a pas de sens pour moi, mais il ne marche pas retourner toute erreur. S'il vous plaît ignorer la validation primitive car je ne suis pas arrivé à la section du livre où il montre la façon la plus efficace de le faire pour le moment.

def contact(request): 
    errors = [] 

    if request.method == 'POST': 
     if not request.POST.get('subject',''): 
      errors.append('Enter a subject') 
     if not request.POST.get('message',''): 
      errors.append('Enter a message') 
     if request.POST.get('email', '') and '@' not in request.POST['email']: 
      errors.append('Enter a valid email address') 
     if not errors: 
      send_mail(
       request.POST['subject'], 
       request.POST['message'], 
       request.POST.get('email', '[email protected]'), ['[email protected]'],) 
      return HttpResponseRedirect('/contact/thanks/') 

    return render_to_response('contact_form.html', { 'errors': errors }, context_instance=RequestContext(request)) 

Mon problème est avec la toute dernière ligne de cette fonction de vue. Il est seulement appelé si request.method! = POST. Cela me semble complètement faux. Ne devrais-je pas appeler "context_instance = RequestContext (request)" quand il fait un POST?

Répondre

7

POST doit être utilisé pour les informations sensibles, telles que les mots de passe, et django doit être sécurisé avec csrf_token; GET doit être utilisé pour les éléments pouvant être mis en signet qui n'ont pas besoin d'être sécurisés, comme les recherches. Vous le faites bien.

EDIT

Vous ne devriez pas appellerez context_instance=RequestContext(request) quand il fait un POST, vous devriez l'appeler quelque soit le type de demande. Regardez-le comme ceci:

  • Est-ce un POST? Cela signifie que le formulaire a été soumis. nous validons le formulaire, et redirige l'utilisateur vers une autre page si le formulaire est OK, ou montre le formulaire à nouveau à l'utilisateur, avec les erreurs. Il s'agit d'un GET? cela signifie que le formulaire n'a pas été soumis, mais d'autres choses se produisent dont nous ne tenons pas compte (un lien de référence ou d'autres choses). Afficher la forme de toute façon

Actions en italique sont faites par le dernier retour, quel que soit le cas.

Questions connexes