2010-08-25 7 views
5

I moduli utilizzano il metodo POST necessario per la protezione CSRF? Sto seguendo un libro e gli esempi di codice generano errori 403. Ho fatto qualche ricerca e sembra come se avessi bisogno di abilitare CSRF in tutte le mie forme.Django: il modulo POST richiede CSRF? GET no?

Le mie domande sono:

  1. fa Django ora richiedono che tutte le forme POST essere protette da CSRF?

  2. Tutto quello che devi fare per raggiungere questo obiettivo è aggiungere 'django.middleware.csrf.CsrfViewMiddleware', render_to_response ritorno (modello, dizionario, context_instance = RequestContext (richiesta), e aggiungere '{% csrf_token%}' nel forma corrispondente? mi manca qualcosa qui?

Quando faccio questo, il modulo funziona bene. Quando uno di questi pezzi sono mancanti, non riesce a 403. voglio solo per assicurarsi che lo sto facendo DESTRA :)

Grazie in anticipo.

edit:

Per qualche ragione questo codice non ha senso per me, ma che pretende molto restituisce alcun errore. Si prega di ignorare la convalida primitiva in quanto non ho ottenuto la sezione del libro in cui mostra il modo più efficiente per farlo ancora.

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)) 

Il mio problema è con l'ultima riga di questa funzione di visualizzazione. Viene chiamato solo se request.method! = POST. Questo mi sembra completamente sbagliato. Non dovrei chiamare "context_instance = RequestContext (request)" quando sta facendo un POST?

risposta

7

Il POST deve essere utilizzato per informazioni sensibili, come le password, e django richiede di proteggerlo con csrf_token; GET dovrebbe essere usato per cose segnalabili che non devono essere protette, come le ricerche. Lo stai facendo GIUSTO.

EDIT

Non si dovrebbe essere chiamando context_instance=RequestContext(request) quando si sta facendo un POST, si dovrebbe essere chiamata a prescindere dal tipo di richiesta. Guardalo in questo modo:

  • È un POST? questo significa che il modulo è stato presentato. convalidiamo il modulo e reindirizziamo l'utente a un'altra pagina se il modulo è OK oppure mostra nuovamente il modulo all'utente, con gli errori.
  • È un GET? questo significa che il modulo non è stato inviato, ma stanno accadendo altre cose a cui non interessa (alcuni link di referrer o altre cose). Mostra il form in ogni caso

azioni in corsivo sono fatte da l'ultimo ritorno, a prescindere dal caso.