Rails Sessions aktuelle Praktiken

83

Hat jemand Tipps zu "Best Practices" für Rails und Sessions? Der Standard-Sitzungstyp für Rails 3 ist immer noch CookieStore, oder? Ich habe SqlSessionStore eine Weile benutzt und es hat gut funktioniert, aber ich kann mich zugunsten von CookieStore davon entfernen.

Ist es immer noch keine gute Idee, CookieStore für vertrauliche Informationen zu verwenden, selbst bei gesalzenen Informationen, oder ist das besser in der Datenbank gespeichert?

Lukas
quelle
1
Was sind die aktuellen Gedanken zur Verwendung von Memcached für die Sitzungsspeicherung?
Lukas

Antworten:

102

Verwenden Sie die Datenbank für Sitzungen anstelle der Cookie-basierten Standardeinstellung, die nicht zum Speichern streng vertraulicher Informationen verwendet werden sollte

Erstellen Sie die Sitzungstabelle mit

rake db:sessions:create

Führen Sie die Migration aus

rake db:migrate

Stellen Sie sicher, dass Sie Rails auch anweisen, ActiveRecord zum Verwalten Ihrer Sitzungen zu verwenden.

Schienen 3

config / initializers / session_store.rb:

Rails.application.config.session_store :active_record_store

Schienen 2

config / environment.rb:

config.action_controller.session_store = :active_record_store
Vulkanisch
quelle
2
Ich habe zuletzt gehört, dass ARstore für Sitzungen sehr langsam war. kennt jemand Benchmarks?
Lukas
4
Wenn Sie das Wachstum der Sitzungstabelle beobachten und einen Job einrichten, um ihn entsprechend zu bereinigen, treten keine Leistungsprobleme auf.
Bill Leeper
3
Widerspricht dies der Entwicklung?
David Mauricio
4
Hier, Rails 3.2, ist es so etwas wie TheNameOfMyApplication :: Application.config.session_store: active_record_store
Eduardo
3
Das rake db:sessions:createist in Rails 4 veraltet und wird entfernt, da es für Anwendungen mit vielen Benutzern nicht gut skalierbar ist (zu viele Datenbanklese- und -schreibvorgänge). Siehe Rails 4.0, Rake DB: Sessions: Create .
53

Cookies werden in Rails 4 standardmäßig verschlüsselt

In Rails 4 werden CookieStore- Cookies standardmäßig verschlüsselt und signiert:

Wenn Sie nur gesetzt haben secret_token, werden Ihre Cookies signiert, aber nicht verschlüsselt. Dies bedeutet, dass ein Benutzer seine Daten nicht ändern kann, user_idohne den geheimen Schlüssel Ihrer App zu kennen, sondern sie leicht lesen kann user_id. Dies war die Standardeinstellung für Rails 3-Apps.

Wenn Sie festgelegt haben secret_key_base, werden Ihre Cookies verschlüsselt. Dies geht einen Schritt weiter als signierte Cookies, da verschlüsselte Cookies von Benutzern nicht geändert oder gelesen werden können. Dies ist die Standardeinstellung ab Rails 4.

Wenn Sie beide haben secret_tokenund secret_key_baseSet, werden Ihre Cookies verschlüsselt und signiert von Rails erzeugt Cookies 3 werden transparent gelesen und verschlüsselt ein Upgrade - Pfad glätten zu bieten.

Der Active Record Session Store ist in Rails 4 veraltet

Diese Antwort ist in Bezug auf Rails 4 nicht mehr aktuell. Der Active Record Session Store wurde veraltet und aus Rails entfernt, sodass die folgenden Generatoren nicht mehr funktionieren:

  • rake db:sessions:create

  • rails generate session_migration

Darauf wurde in dieser Antwort hingewiesen . Der Grund dafür, dass der Active Record Session Store veraltet war, liegt darin, dass die Lese- / Schreibvorgänge in die Datenbank nicht gut skaliert werden können, wenn eine große Anzahl von Benutzern auf Ihre Anwendung zugreift, wie in diesem Blogbeitrag angegeben :

... ein Hauptproblem beim Active Record-Sitzungsspeicher ist, dass er nicht skalierbar ist. Es belastet Ihre Datenbank unnötig. Sobald Ihre Anwendung viel Verkehr empfängt, wird die Sitzungsdatenbanktabelle kontinuierlich mit Lese- / Schreibvorgängen bombardiert.

Ab Rails 4 wurde der Active Record-Sitzungsspeicher aus dem Kernframework entfernt und ist jetzt veraltet.

Wenn Sie den Active Record Session Store weiterhin verwenden möchten, ist er weiterhin als Juwel verfügbar .

Best Practices für aktuelle Rails-Sitzungen

Für aktuellere Best Practices für Ruby on Rails-Sitzungen empfehlen wir Ihnen, die neuesten Versionen des Ruby on Rails-Sicherheitshandbuchs zu lesen .

Gemeinschaft
quelle
9

Ich glaube nicht, dass sich etwas daran geändert hat, wie jemand auf einer Plattform mit Cookie-basierten Sitzungen umgehen sollte. Seien Sie skeptisch gegenüber allem, was außerhalb der Kontrolle des Servers liegt (Cookies, Formularbeiträge usw.). Dies ist ein allgemeines Prinzip der Webentwicklung.

Was die Verschlüsselung betrifft, weiß ich nicht, ob sich an dieser Front etwas geändert hat.

Bei einem Cookie-Speicher ist zu beachten, dass die Datenmenge begrenzt ist und dass diese Daten bei jeder Anforderung auf dem Kabel gesendet werden, wenn ein Datenbankspeicher nur die ID überträgt und die Daten auf dem Server gespeichert sind .

Tilendor
quelle
4

FWIW, Rails 3.1 schlägt vor zu laufen

rails generate session_migration

Dies erzeugt jedoch genau die gleiche Migration wie

rake db:sessions:create
Nate Milbee
quelle
Aus dem gleichen Grund db:sessions:createruft die Rechenaufgabe jetzt direkt den session_migrationGenerator auf. task: create =>: environment löst "Task für diese Datenbank nicht verfügbar (keine Migrationsunterstützung)" aus, es sei denn, ActiveRecord :: Base.connection.supports_migrations? erfordern 'Schienen / Generatoren' Rails :: Generators.configure! erfordern 'Rails / Generators / Rails / Session_Migration / Session_Migration_generator' Rails :: Generators :: SessionMigrationGenerator.start [ENV ["MIGRATION"] || "add_sessions_table"] end
slant
Die rake db:sessions:createund rails generate session_migrationGeneratoren sind veraltet und entfernt in Rails 4, weil sie für Anwendungen mit vielen Benutzern nicht gut skalieren (zu viele Datenbank liest und schreibt). Siehe Rails 4.0, Rake DB: Sessions: Create .
2

Die Rails-Standardeinstellungen scheinen mir ziemlich gut zu sein. Der CookieStore ist schnell und sollte die meisten Anwendungsfälle abdecken. Sicher, Sie sind auf 4 KB beschränkt und Ihre Daten sind für den Benutzer sichtbar. Die Rails-Methode besteht jedoch darin, die Sitzung nur für ganzzahlige IDs und grundlegende Zeichenfolgenwerte zu verwenden. Wenn Sie versuchen, Objekte oder streng vertrauliche Informationen in einer Sitzung zu speichern Du machst es wahrscheinlich falsch.

Yarin
quelle