2013-02-13 12 views
6

Mam aplikację Flask, serwowaną z Nginx + WSGI (FastCGI & Gevent) i używam standardowych sesji Flask. Zrobić nie użyć session.permanent=True lub jakiejkolwiek innej dodatkowej opcji, ale po prostu ustawić SECRET_KEY w domyślnej konfiguracji.Identyfikatory sesji stałej kolby

Nie wykonuję ani nie zapisuję żadnych par (kluczy, wartości) w sesji i bazuję tylko na wpisie SID = session['_id'], aby zidentyfikować powracającego użytkownika. Używam następujący kod do odczytu SID:

@page.route ('/') 
def main (page='home', template='index.html'): 

    if not request.args.get ('silent', False): 
     print >> sys.stderr, "Session ID: %r" % session['_id'] 

Zrobiłem następujące obserwacje:

  1. Dla samych adresów IP, ale z różnych przeglądarek mam inny SIDs - to oczekiwano;
  2. Dla różnych adresów IP & ta sama przeglądarka znów ma inną wartość: SIDs - oczekiwana;
  3. Dla tego samego adresu IP w tej samej przeglądarce otrzymuję ten sam SID - również oczekiwany;

Teraz punkt (3) jest interesujący, ponieważ nawet jeśli usuwać odpowiedni Cookie SID pozostaje stałą! Do pewnego stopnia nawet to może być zrozumiałe, ale w rzeczywistości oczekiwałem, że SID zmieni się między różnymi plikami cookie. Ale jedyną różnicą jest to, że widzę

session.new is True 

dla pierwszy żądanie natychmiast po skreślenia cookie. Nawet to jest bardzo oczekiwane; ale biorąc pod uwagę te fakty, że stoją następujące problemy:

  1. Czy to oznacza, że ​​dla różne użytkownicy siedzący za samym IP (z tej samej konfiguracji przeglądarki) my back-end będzie pomylić je dla ten sam użytkownik?

  2. Jeśli punkt (1) jest nie przypadek, obecne zachowanie tych „lepkie” sesji jest całkiem przyjemne, ponieważ pozwala to uniknąć sytuacji, w której moi użytkownicy mogą stracenia tam dane tylko dlatego, że usunięte odpowiedni plik cookie .

    Mogą nadal zapisać dzień, ponownie odwiedzając witrynę z tej samej sieci z tą samą przeglądarką. Podoba mi się, ale tylko , jeśli punkt (1) jest nie przypadku.

  3. Zakładam punkt (1) faktycznie bite me, byłoby zawarcie faktycznie zaoszczędzić token w sesji, a więc zaakceptować los, że użytkownik może wysadzić się w powietrze, po prostu usuwając jego ciasteczko?

  4. Czy istnieje sposób, aby powiedzieć Flask, aby nadać różne SIDs dla każdego świeżego pliku cookie?

Właściwie to pytanie wzbudzić ponieważ użyłem usługę wpływu obciążenia, która była symulacja różne użytkowników (na tym samym IP), ale my back-end przechowywane widząc je jako pojedynczy użytkownik, ponieważ odpowiada SIDs były wszystkie takie same.

Aplikacja jest dostępna do testów na http://webed.blackhan.ch (które po zwolnieniu przeniesie https://notex.ch [edytor tekstowy przeglądarka]). Dziękuję Ci za Twoje odpowiedzi.

Odpowiedz

5

Wygląda na to, że używasz rozszerzenia Flask-Login. Oto kod, który generuje token ID:

def _create_identifier(): 
    base = unicode("%s|%s" % (request.remote_addr, 
           request.headers.get("User-Agent")), 'utf8', errors='replace') 
    hsh = md5() 
    hsh.update(base.encode("utf8")) 
    return hsh.digest() 

to w zasadzie tylko md5(ip_address + user_agent).

Kolba używa Werkzeug's secure cookies do przechowywania tego identyfikatora. Bezpieczne pliki cookie są bezpieczne (według ich nazwy):

Ten moduł implementuje plik cookie, który nie może być zmieniony przez klienta, ponieważ dodaje sumę kontrolną sprawdzaną przez serwer. Możesz użyć go jako wymiany sesji, jeśli wszystko, co masz, to identyfikator użytkownika lub coś, co oznacza zalogowanego użytkownika.

+0

Dziękuję za odpowiedź: rzeczywiście używam 'Flask-Login' i wydaje mi się, że to wyjaśnia, dlaczego widziałem tylko jednego użytkownika z tą samą kombinacją (IP, User-Agent). Wprowadziłem token do pliku cookie, aby móc go odróżnić w tym przypadku. – hsk81

+0

@ hsk81: To dziwne. Jestem całkiem pewny, że sesje Flasku mają przydzielone losowe identyfikatory, aby zapobiec takim problemom. – Blender

+0

Nie mam pojęcia, to daje mi stałą wartość dla 'session ['_ id']' nawet po usunięciu cookie. Mam wrażenie, że nie ma takiej randomizacji, lub w jakiś sposób 'session ['_ id']' jest niewłaściwym sposobem uzyskania dostępu do tożsamości sesji. Nie znalazłem wzmianki o tym, jakie powinno być podejście * kanoniczne *, i po prostu zajrzałem do cookie, w jaki sposób Flask tworzy i używa tego: ''id''. Być może przeoczyłem coś w dokumentacji. – hsk81

0

session['_id'] nie jest faktycznym identyfikatorem sesji. Jest to tylko wartość używana przez Flask-Login do implementacji Session Protection.

Standardowy Sesje z kolbą nie mają identyfikatora SID - ponieważ nie byłoby to celowe, ponieważ rzeczywista treść sesji jest przechowywana w samym pliku cookie. Zobacz także this.