2013-02-13 15 views
6

Ich habe eine Flask Anwendung, serviert mit Nginx + WSGI (FastCGI & Gevent) und Standard-Flask-Sitzungen verwenden. Ich mache nicht Verwenden Sie die session.permanent=True oder eine andere zusätzliche Option, aber einfach SECRET_KEY in der Standardkonfiguration festlegen.Konstante Flask Session IDs

Ich mache nicht Speichern Sie alle (Schlüssel, Wert) Paare in der Sitzung, und verlassen Sie sich nur auf den SID = session['_id'] Eintrag, um einen wiederkehrenden Benutzer zu identifizieren. Ich verwende den folgenden Code das Lesen der 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'] 

ich folgende Beobachtungen gemacht:

  1. Für die gleichen IP-Adressen, aber verschiedenen Browsern ich verschiedene SIDs - das erwartet wird;
  2. Für verschiedene IPs & gleichen Browser habe ich wieder anders SIDs - erwartet;
  3. Für die gleiche IP-Adresse mit dem gleichen Browser bekomme ich das gleiche SID - auch erwartet; Jetzt

, Punkt (3) ist interessant, denn selbst wenn ein löschen das entsprechende Cookie die SIDkonstant bleibt! In gewissem Maße sogar das könnte verständlich sein, aber eigentlich habe ich erwartet, dass die SID zwischen verschiedenen Cookies wechseln. Aber der einzige Unterschied, den ich sehe, ist, dass

session.new is True 

für die ersten Anfrage unmittelbar nach dem Löschen des Cookies. Sogar das wird sehr erwartet; aber diese Tatsachen gegeben ich die folgenden Problemen konfrontiert:

  1. Bedeutet dies, dass für verschiedene Benutzer hinter dem gleichen IP Sitzung (mit dem gleichen Browser-Konfiguration) mein Back-End ihnen für die verwechseln wird gleiche Benutzer?

  2. Wenn Punkt (1) nicht der Fall ist, das aktuelle Verhalten dieser „sticky“ Sitzungen ist eigentlich recht angenehm, da dies die Situation vermeidet, wo meine Benutzer nur dort Daten verloren gehen könnten, weil sie das entsprechende Cookie gelöscht .

    Sie können den Tag noch speichern, indem Sie die Website aus demselben Netzwerk mit demselben Browser erneut aufrufen. Ich mag das, aber nur wenn Punkt (1) ist nicht der Fall.

  3. Ich nehme an, Punkt (1) wird mich tatsächlich beißen, wäre die Schlussfolgerung eigentlich eine token in der Sitzung zu speichern und damit das Schicksal, dass der Benutzer sich in die Luft sprengen kann, einfach durch Löschen seines Cookies akzeptieren?

  4. Oder gibt es eine Möglichkeit, Flask zu geben, um verschiedene SIDs für jeden frischen Cookie zu geben?

Eigentlich ist diese Frage zu wecken, da ich eine Last Auswirkungen Dienst verwendet, die verschiedenen Benutzer wurde simuliert (auf der gleichen IP), aber mein Back-End hielt sie als einzelner Nutzer zu sehen, da die entsprechenden SIDs waren alles das selbe.

Die Anwendung ist für Tests bei http://webed.blackhan.ch zur Verfügung (die nach der Freigabe wird die https://notex.ch [ein Browser-basiertes Texteditor] bewegen). Danke für deine Antworten.

Antwort

5

Es sieht so aus, als ob Sie die Flask-Login-Erweiterung verwenden. Hier ist der Code, der die ID-Token erzeugt:

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() 

Es ist im Grunde nur md5(ip_address + user_agent).

Flask verwendet Werkzeug's secure cookies, um diese Kennung zu speichern. Sichere Cookies sind (wie der Name schon sagt) sicher:

Dieses Modul implementiert einen Cookie, der vom Client nicht änderbar ist, weil er eine Prüfsumme hinzufügt, nach der der Server sucht. Sie können es als Sitzungsaustausch verwenden, wenn Sie nur eine Benutzer-ID oder etwas zum Markieren eines angemeldeten Benutzers haben.

+0

Vielen Dank für die Antwort: In der Tat verwende ich 'Flask-Login' und ich denke, das erklärt, warum ich nur einen einzigen Benutzer mit der gleichen (IP, User-Agent) Kombination sah. Ich habe ein Token in den Cookie eingeführt, um in diesem Fall unterscheiden zu können. – hsk81

+0

@ hsk81: Das ist seltsam. Ich bin mir ziemlich sicher, dass Flasks Sitzungen zufällige IDs zugewiesen werden, um Probleme wie diese zu vermeiden. – Blender

+0

Keine Ahnung, es gibt mir einen konstanten Wert für 'session ['_ id']' selbst nach dem Löschen des Cookies. Mein Eindruck ist, dass es keine solche Randomisierung gibt, oder irgendwie ist 'session ['_ id'] 'der falsche Weg, um auf die Identität einer Sitzung zuzugreifen. Ich habe keinen Hinweis darauf gefunden, was der * kanonische * Ansatz hier sein soll, und habe einfach in den Cookie hineingeschaut, welchen Eintrag Flask erstellt und benutzt: ''_id''. Ich habe vielleicht etwas in der Dokumentation übersehen. – hsk81

0

session['_id'] ist kein tatsächlicher Sitzungsbezeichner. Es ist nur ein Wert, der von Flask-Login verwendet wird, um Session Protection zu implementieren.

Standard- Flask Sitzungen keine SID haben - wie es zwecklos wäre, da der eigentliche Inhalt der Sitzung in dem selbst Cookie gespeichert wird. Siehe auch this.