Flask Sessions - best practice

Django, Flask, Bottle, WSGI, CGI…
Antworten
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

Hallo Forum,

zur Zeit arbeite ich mich in Flask ein un bin auch sehr zufrieden damit :)

Als ich nun ein kleines Login-System geschrieben hatte fiel mir auf, dass die Standartsessions in Flask eigentlich Signed-Cookies sind (hoffe damit liege ich richtig).

Aus Sicherheitsgründen ist das ja ehr ungeeignet für ein Login-System.

Meine Frage ist nun was sich am "besten" als eine serverseite Lösung - also ähnlich wie z.B. in PHP - für Sessions in Flask eignet?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Signed-Cookies sind vollkommen OK für ein Login System. Wieso glaubst du dass sei nicht so?
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

Dachte die könne man entschlüsseln und würde dann an die Daten der Session kommen?

Dachte auch etwas gelesen zu haben mit folgendem Wortlaut:
Better Client-side sessions
By Armin Ronacher filed in Sessions

Flask by default uses the Werkzeug provided 'secure cookie' as session system. It works by pickling the session data, compressing it and base64 encoding it.

Motivation
This was a reasonable decision at the time but now there are better modules available and if you are fine with another external dependency you could start using itsdangerous instead of the secure cookie which works the same but has a couple of advantages:
Aus php Zeiten bin ich es einfach gewohnt wichtige Daten eben genau deswegen in Sessions zu speichern. Mit der SSID kann niemand Rückschlüsse auf die Daten ziehen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Entschlüsseln muss man die noch nichtmal, die Daten in dem Cookie sind ja nur signiert und nicht verschlüsselt. Das man an die Daten darin kommt sollte aber für ein Loginsystem keine Rolle spielen. Für letzteres musst du ja nur in der Session speichern welcher User momentan eingeloggt ist.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Herb: ich habe das Gefühl, Du bringst ein paar Dinge durcheinander. Solange der geheime Schlüssel geheim ist, spricht nichts gegen signed cookies. Das signieren verhindert, dass der Client die Daten verändern kann, dass der Server also sicher sein kann, wenn da ein User-Name im Cookie steht, der User sich auch einmal mit Passwort angemeldet hat. Dass der Benutzer seinen Usernamen im Cookie lesen kann, ist ja nicht schlimm. Von daher wird kaum etwas in einem Session-Cookie gespeichert werden, was der Benutzer nicht auch so erfahren könnte.
Es ist eher die Frage, wie viel Information Du pro Session speichern willst. Cookies haben nur eine begrenzte Länge und die Daten müssen ja auch bei jedem Request hin und her übertragen werden.
Bei Server-side Sessions dagegen mußt Du genauso darauf achten, dass nicht irgendwer den Session-Key modifiziert und so Zugriff auf fremde Daten erhält. Das Snippet hier prüft nicht einmal die IP-Addresse und erlaubt zudem noch den Zugriff auf beliebige Dateien im System. Zudem scheint der Mangel an Server-Side-Session-Lösungen für Flask zu zeigen, dass sie nicht wirklich gebraucht werden.
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

Ahh hatte ich tatsächlich falsch verstanden, Danke :)

Ich will nichts weiter in der Session speichern, nur eine ID um den User identifizieren zu können und ein vermerkt das der User auch nicht zwischenzeitlich wieder ausgeloggt wurde ... den Rest hole ich mir aus der Datenbank.

Wenn jetzt aber ein Bösewicht - aus welchem Grund auch immer - die ID eines Users kennt/errät, müsste dieser aber noch meinen secret_key wissen um sich selbst einen cookie zu 'basteln', richtig? Was kostet eine Stunde bruteforcen in der Amazon Cloud? :D

Versteht mich bitte nicht falsch, man muss schließlich auch immer mit soetwas wie session hijacking/xss rechnen aber ich würde mich wohler finden wenn niemand weiß wie ich den user authentifiziere :K
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Herb: erstens, die Signatur ist in soweit sicher, dass man auch nicht mit vielen MegaEuros den Schlüssel berechnen kann. Zweitens dürfte es wohl viel einfacher sein, Deinen Server zu kompromittieren und drittens und viertens sind wohl sozial engineering oder brute-force Attacken auf die Passwörter Deiner Nutzer nochmals viel einfacher, geschweige denn von Mans-in-the-middle und Trojanern. Aber wahrscheinlich würde auch ein ROT13 als Sicherheit ausreichen, weil niemand auch nur 5€ in die Hand nimmt, um Dein System zu knacken. Es ist immer eine Frage von Aufwand und Nutzen. Wenn Du Security-by-Obscurity brauchst, dann ist Dein System garantiert unsicher.
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

Lohnenswert wäre das zweifelsohne für niemanden aber deswegen muss ich ja nicht gleich die Tür offen stehen lassen :)

Du hast mir auf jeden Fall weiter geholfen, Dankeschön!

PS: was meinst du damit?
Wenn Du Security-by-Obscurity brauchst, dann ist Dein System garantiert unsicher
Antworten