2010-04-20 10 views
5

Recientemente comencé a trabajar en Django y ahora mi aplicación está casi terminada y comencé a preguntarme sobre la seguridad y las mejores prácticas.Django view security and best-practices

Tengo una vista que genera una página y diferentes funciones en la página que AJAX solicita a las vistas individuales. Por ejemplo, tengo una vista llamada show_employees y puedo eliminar y actualizar empleados al pasar una solicitud posterior a las vistas delete_employee y update_employee.

  1. He puesto @login_required decoradores antes de cada uno de estos puntos de vista ya que no quiero que nadie les acceder sin ser autenticado. ¿Esta bien?

  2. En las vistas delete_employee y update_employee, solo respondo para solicitar si se trata de una solicitud AJAX POST (uisng is_ajax()). ¿Esta bien?

  3. Devuelvo un 'éxito' cuando la vista tiene éxito al hacer lo que se necesita y un error cuando hay un error de Validación en mi formulario, pero todavía no estoy manejando otras excepciones. ¿Cómo debería hacer esto? ¿Debo devolver la página estándar de 500 a través de una respuesta AJAX como this al envolver la vista con un bloque try-except para manejar todas las excepciones?

  4. ¿Hay algo más que pueda hacer segura mi vista?

Aquí es una visión muestra de la mina:

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

Gracias.

Respuesta

11

Bueno, en lugar de solo usar @login_required, sugiero que eche un vistazo al permissions framework y al permission required decorator asociado. De esta forma, puede ajustar las restricciones de acceso por usuario o grupo. También es más fácil y seguro cambiar el comportamiento del usuario después con permisos que con solo un decorador requerido para iniciar sesión. Supongamos que ahora solo tiene administradores, pero luego desea agregar otros tipos de usuarios, luego es fácil perder un decorador requerido para iniciar sesión y otorgar a esos usuarios acceso a las vistas de administrador. No tendrá este problema con permisos definidos correctamente.

A continuación, is_ajax simplemente comprueba el encabezado HTTP_X_REQUESTED_WITH. Esto no tiene que ver realmente con la seguridad, sino con un comportamiento amigable para el usuario. De esta forma, evita que un usuario normal abra accidentalmente esa página en el navegador y obtenga datos extraños. No ayuda nada en seguridad, cada hacker decente puede configurar un encabezado HTTP adicional :).

No manipular excepciones puede ser potencialmente peligroso, si se va accidentalmente en el DEBUG=True, en cuyo caso django proporcionará fragmentos de código y trazas inversas, lo que podría revelar debilidades. Pero, si esta opción está desactivada, django mostrará su propia página de 500 errores. Mi sugerencia es: busque todas las excepciones esperadas de django (no son tantas) y asegúrese de detectarlas correctamente. Además, yo diría que dejemos que django maneje la otra excepción, django seguirá brindando posibilidades de generar trazas inversas y otra información de depuración y enviárselas a los administradores en lugar de mostrarlas en el sitio. Si detecta todos los errores inesperados, este comportamiento no estará directamente disponible, lo que puede dejarlo desconocido sobre el error del código.

Finalmente, como está trabajando con los datos de entrada del usuario, le sugiero que consulte el security chapter en el libro django, explica las amenazas más importantes y cómo manejarlas en el marco django.