2010-05-09 15 views
11

Acabo de agregar este middleware SSL a mi sitio http://www.djangosnippets.org/snippets/85/ que solía proteger solo mi página de inicio de sesión para que las contraseñas no se envíen en texto claro. Por supuesto, cuando el usuario navega fuera de esa página, se desconecta repentinamente. Entiendo por qué sucede esto, pero ¿hay alguna manera de pasar la cookie a HTTP para que los usuarios puedan permanecer conectados?Django: HTTPS solo para la página de inicio de sesión?

Si no es así, ¿hay alguna manera fácil de usar HTTPS para la página de inicio de sesión (y tal vez la página de registro) y mantenerla en HTTPS si el usuario está conectado pero volver a HTTP si el usuario no inicia sesión?

Hay muchas páginas que son visibles tanto para los usuarios que inician sesión como para las que no, por lo que no puedo simplemente designar ciertas páginas como HTTP o HTTPS.

+0

Entonces ... respondió su pregunta cuatro minutos después de haberla publicado ... ¿Hemos terminado aquí? En otra nota, ¿es una buena idea pasar esa cookie por HTTP no cifrado? ¿Podría ser olfateado y luego utilizado para falsificar el inicio de sesión del otro usuario? –

+0

Sí ... probablemente podrían secuestrar la sesión. Sin embargo, robar una contraseña es probablemente algo peor que secuestrar una sesión. Sin embargo, he decidido habilitar cookies seguras y nada ha explotado. Y pensé en la respuesta poco después de publicarla, ¿de acuerdo? Lo dejé en caso de que otras personas tuvieran una idea ... o quisieran saber la respuesta. Lea las preguntas frecuentes, SO lo alienta: p – mpen

+5

Claro, robar una contraseña es peor, pero ¿por qué no simplemente ejecutar toda la sesión en HTTPS? –

Respuesta

3

En realidad, la modificación del middleware como tal parece que funciona bastante bien:

class SSLRedirect: 

    def process_view(self, request, view_func, view_args, view_kwargs): 
     if SSL in view_kwargs: 
      secure = view_kwargs[SSL] 
      del view_kwargs[SSL] 
     else: 
      secure = False 

     if request.user.is_authenticated(): 
      secure = True 

     if not secure == self._is_secure(request): 
      return self._redirect(request, secure) 

    def _is_secure(self, request): 
     if request.is_secure(): 
      return True 

     #Handle the Webfaction case until this gets resolved in the request.is_secure() 
     if 'HTTP_X_FORWARDED_SSL' in request.META: 
      return request.META['HTTP_X_FORWARDED_SSL'] == 'on' 

     return False 

    def _redirect(self, request, secure): 
     protocol = secure and "https://secure" or "http://www" 
     newurl = "%s.%s%s" % (protocol,settings.DOMAIN,request.get_full_path()) 
     if settings.DEBUG and request.method == 'POST': 
      raise RuntimeError, \ 
     """Django can't perform a SSL redirect while maintaining POST data. 
      Please structure your views so that redirects only occur during GETs.""" 

     return HttpResponsePermanentRedirect(newurl) 
0

Mejor es para asegurar todo. La mitad de seguridad parece segura, pero no es totalmente así. Para ponerlo en blanco: al hacerlo, estás engañando a tus usuarios finales dándoles una falsa sensación de seguridad.

Entonces o no use ssl o mejor: úselo hasta el final. La sobrecarga para el servidor y el usuario final es insignificante.

Cuestiones relacionadas