2010-04-20 24 views
5

Ho iniziato a lavorare su Django e ora la mia app è quasi completata e ho iniziato a chiedermi sicurezza e best practice.Django visualizza sicurezza e best practice

Ho una vista che genera una pagina e diverse funzioni nella pagina posta richieste AJAX a singole viste. Ad esempio, ho una vista chiamata show_employees e posso eliminare e aggiornare i dipendenti passando una richiesta di posta alle viste delete_employee e update_employee.

  1. ho messo @login_required decoratori prima di ciascuno dei questi punti di vista dal momento che non voglio che nessuno di loro si accede senza essere autenticati. Va bene?

  2. Nelle viste delete_employee e update_employee, rispondo solo alla richiesta se si tratta di una richiesta POST AJAX (uisng is_ajax()). Va bene?

  3. Restituisco un 'successo' quando la vista riesce a fare ciò che è necessario e un errore quando c'è un errore di convalida nel mio modulo ma non sto ancora gestendo altre eccezioni. Come dovrei farlo? Devo restituire una pagina standard di 500 attraverso una risposta AJAX come this avvolgendo la vista con un blocco try-except per gestire tutte le eccezioni?

  4. C'è altro che posso fare per proteggere il mio punto di vista?

Ecco un Campione di vista di mine:

@login_required 
    def add_site(request): 
     data = {} 
     if request.method == 'POST': 
      if request.is_ajax(): 
       form = AddSiteForm(request.user, request.POST) 
       if form.is_valid(): 
        site = form.save(commit=False) 
        site.user = request.user 
        site.save() 
        data['status'] = 'success' 
        data['html'] = render_to_string('site.html', locals(), context_instance=RequestContext(request)) 
        return HttpResponse(simplejson.dumps(data), mimetype='application/json') 
       else: 
        data['status'] = 'error' 
        data['errors'] = {} 
        for field, error in form.errors.iteritems(): 
         data['errors']['id_'+field] = strip_tags(unicode(error)) 
        return HttpResponse(simplejson.dumps(data), mimetype='application/json') 

Grazie.

risposta

11

Bene, invece di utilizzare @login_required, suggerisco di dare un'occhiata allo permissions framework e allo permission required decorator associato. In questo modo è possibile mettere a punto le restrizioni di accesso su base utente o di gruppo. È anche più facile e più sicuro cambiare il comportamento degli utenti in seguito con le autorizzazioni piuttosto che con un semplice decoratore login_required. Supponiamo ora che tu abbia solo amministratori, ma in seguito vuoi aggiungere altri tipi di utenti, è quindi facile perdere un decoratore login_qualificato e concedere a tali utenti l'accesso alle visualizzazioni di amministrazione. Non avrai questo problema con le autorizzazioni correttamente definite.

Successivamente, is_ajax controlla solo l'intestazione HTTP_X_REQUESTED_WITH. Questo non ha davvero a che fare con la sicurezza, ma con un comportamento user friendly. In questo modo si impedisce ad un utente normale di aprire accidentalmente quella pagina nel browser e ottenere alcuni dati strani. Non aiuta nulla in sicurezza, ogni hacker decente può impostare un'intestazione HTTP aggiuntiva :).

La mancata gestione delle eccezioni può essere potenzialmente pericolosa, se si lascia accidentalmente il DEBUG=True, nel qual caso django fornirà pezzi di codice e backtrace, potenzialmente dando via punti deboli. Ma, se questa opzione è disattivata, django mostrerà la propria pagina di errore 500. Il mio suggerimento è: cerca tutte le eccezioni previste da django (non sono così tante) e assicurati di prenderle correttamente. Inoltre, direi che l'altra eccezione sarà gestita da django, django offrirà comunque possibilità di generare backtrace e altre informazioni di debug e inviarli agli amministratori invece di visualizzarli sul posto. Se rilevi tutti gli errori imprevisti questo comportamento non sarà direttamente disponibile, forse lasciandoti sconosciuto sul codice in errore.

Infine, mentre stai lavorando con i dati di input dell'utente, ti suggerisco di dare un'occhiata allo security chapter nel libro django, spiega le minacce più importanti e come gestirle nel framework django.