2010-05-09 22 views
11

Właśnie dodałem to oprogramowanie pośredniczące SSL do mojej strony http://www.djangosnippets.org/snippets/85/, którego użyłem do zabezpieczenia tylko mojej strony logowania, aby hasła nie były wysyłane w postaci czystego tekstu. Oczywiście, gdy użytkownik nawiguje z dala od tej strony, nagle się wylogował. Rozumiem, dlaczego tak się dzieje, ale czy istnieje sposób przekazania pliku cookie do HTTP, aby pozostać zalogowanym?Django: HTTPS dla strony logowania?

Jeśli nie, czy jest łatwy sposób mogę użyć HTTPS do strony logowania (i może strony rejestracji), a następnie pozostawić go na HTTPS, jeśli użytkownik jest zalogowany, ale wrócić do HTTP, jeśli użytkownik nie loguje się?

Istnieje wiele stron, które są widoczne zarówno dla zalogowanych użytkowników, jak i nie, więc nie mogę po prostu oznaczać niektórych stron jako HTTP lub HTTPS.

+0

Więc ... odpowiedziałeś na swoje pytanie cztery minuty po tym, jak je opublikowałeś ... skończyliśmy? Inna uwaga: czy dobrym pomysłem jest przekazanie tego pliku cookie na niezaszyfrowany HTTP? Czy można go podsłuchać, a następnie sfałszować logowanie innego użytkownika? –

+0

Tak, prawdopodobnie porwali sesję. Kradzież hasła jest prawdopodobnie nieco gorsza niż przejęcie sesji. Postanowiłem jednak włączyć bezpieczne ciasteczka i nic się nie wydarzyło. I pomyślałem o odpowiedzi wkrótce po opublikowaniu, ok? Zostawiłem to na wypadek, gdyby inni ludzie mieli wgląd ... lub chcieli znać odpowiedź. Przeczytaj FAQ, więc zachęca: p – mpen

+5

Oczywiście, kradzież hasła jest gorsza, ale dlaczego nie po prostu uruchomić całą sesję pod HTTPS? –

Odpowiedz

3

Faktycznie, modyfikując middleware tak jak wydaje się całkiem dobrze:

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

Lepiej jest zapewnienie wszystko. Pół bezpieczne wydaje się być bezpieczne, ale zupełnie nie jest. Żeby było puste: robiąc to, oszukujesz użytkowników końcowych, dając im fałszywe poczucie bezpieczeństwa.

Więc nie używaj ssl lub lepiej: używaj go do końca. Obciążenie zarówno dla serwera, jak i dla użytkownika końcowego jest znikome.

Powiązane problemy