2010-05-09 3 views
11

Je viens d'ajouter ce middleware SSL à mon site http://www.djangosnippets.org/snippets/85/ que j'ai utilisé pour sécuriser uniquement ma page de connexion afin que les mots de passe ne soient pas envoyés en clair. Bien sûr, lorsque l'utilisateur quitte cette page, il est soudainement déconnecté. Je comprends pourquoi cela se produit, mais existe-t-il un moyen de passer le cookie à HTTP afin que les utilisateurs puissent rester connectés? Si ce n'est pas le cas, y a-t-il un moyen simple d'utiliser HTTPS pour la page de connexion (et peut-être la page d'enregistrement), puis de rester sur HTTPS si l'utilisateur est connecté? ne se connecte pas?Django: HTTPS pour juste la page de connexion?

Il y a beaucoup de pages qui sont visibles à la fois pour les utilisateurs connectés et non, donc je ne peux pas simplement désigner certaines pages comme HTTP ou HTTPS.

+0

Alors ... vous avez répondu à votre question quatre minutes après l'avoir posté ... avons-nous fini ici? Sur une autre note, est-ce une bonne idée de passer ce cookie par HTTP non crypté? Pourrait-il être reniflé et ensuite utilisé pour usurper la connexion de l'autre utilisateur? –

+0

Ouais ... ils pourraient probablement détourner la session. Voler un mot de passe est probablement un peu pire que de détourner une session. J'ai décidé d'activer les cookies sécurisés et rien n'a explosé. Et j'ai pensé à la réponse peu après l'avoir publiée, d'accord? Je l'ai laissé dans le cas où d'autres personnes ont eu un aperçu ... ou veulent connaître la réponse. Lisez la FAQ, SO l'encourage: p – mpen

+5

Bien sûr, voler un mot de passe est pire, mais pourquoi ne pas simplement exécuter la session entière sous HTTPS? –

Répondre

3

En fait, la modification du middleware comme si semble fonctionner assez 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

Mieux vaut pour tout sécuriser. La moitié sécurisée semble sécurisée, mais ne l'est pas du tout. Pour le dire en blanc: en faisant cela, vous trompez vos utilisateurs finaux en leur donnant un faux sentiment de sécurité. Donc, n'utilisez pas ssl ou mieux: utilisez-le jusqu'au bout. La surcharge pour le serveur et l'utilisateur final est négligeable.

Questions connexes