Rails-сесії поточної практики


83

Хто-небудь має підказки щодо "найкращих практик" щодо Rails та сесій? Типом сеансу за замовчуванням для Rails 3 все ще є CookieStore, так? Я деякий час користувався SqlSessionStore, і він працював добре, але я можу відійти від цього на користь CookieStore.

Чи все-таки не є гарною ідеєю використовувати CookieStore для конфіденційної інформації, навіть із засоленою інформацією, чи це краще зберігається в БД?


1
Крім того, які поточні думки щодо використання Memcached для зберігання сеансів?
Лукас

Пов’язане: rails 4.0, rake db: session: create .

Відповіді:


102

Використовуйте базу даних для сесій замість файлу cookie за замовчуванням, який не слід використовувати для зберігання конфіденційної інформації

Створіть таблицю сеансів за допомогою

rake db:sessions:create

Запустіть міграцію

rake db:migrate

Переконайтеся, що ви також наказали рейкам використовувати ActiveRecord для управління сесіями.

Рейки 3

config / Initializers / session_store.rb:

Rails.application.config.session_store :active_record_store

Рейки 2

config / environment.rb:

config.action_controller.session_store = :active_record_store

2
Востаннє я чув, що ARstore для сеансів був дуже повільним. хтось знає тести?
Лукас

4
Якщо ви спостерігаєте за зростанням таблиці сеансів та налаштовуєте роботу на відповідну обрізку, у вас не буде проблем із продуктивністю.
Білл Ліпер

3
Чи це суперечить розробці?
Девід Маурісіо,

4
Тут, Rails 3.2, це щось на зразок TheNameOfMyApplication :: Application.config.session_store: active_record_store
Едуардо

3
Це rake db:sessions:createзастаріло та видалено в Rails 4, оскільки воно погано масштабується для додатків з великою кількістю користувачів (занадто багато читання та запису бази даних). Див. Rails 4.0, rake db: session: create .

53

Файли cookie зашифровані за замовчуванням у Rails 4

У Rails 4 файли cookie CookieStore зашифровані та підписані за замовчуванням:

Якщо ви лише secret_tokenвстановили, ваші файли cookie будуть підписані, але не зашифровані. Це означає, що користувач не може змінити їх, user_idне знаючи секретного ключа вашого додатка, але може легко прочитати їх user_id. Це було за замовчуванням для програм Rails 3.

Якщо ви secret_key_baseвстановили, ваші файли cookie будуть зашифровані. Це робить крок далі, ніж підписані файли cookie, оскільки зашифровані файли cookie не можуть бути змінені або прочитані користувачами. Це стандартне значення, починаючи з Rails 4.

Якщо ви обидва secret_tokenі secret_key_baseвстановили, ваші файли cookie будуть зашифровані, а підписані файли cookie, згенеровані Rails 3, будуть прозоро прочитані та зашифровані, щоб забезпечити плавний шлях оновлення.

Сховище активних записів застаріло в Rails 4

Ця відповідь зараз застаріла щодо Rails 4. Сховище Active Record Session застаріло та видалено з Rails, тому наступні генератори більше не працюватимуть:

  • rake db:sessions:create

  • rails generate session_migration

На це було вказано у цій відповіді . Причиною того, що Active Record Session Store був застарілий, є те, що читання / запис у базу даних погано масштабується, коли у вас є велика кількість користувачів, які отримують доступ до вашої програми, як зазначено в цьому дописі в блозі :

... одна з основних проблем сховища сесій Active Record полягає в тому, що він не є масштабованим. Це створює непотрібне навантаження на вашу базу даних. Як тільки ваша програма отримує великий обсяг трафіку, таблиця бази даних сеансів постійно бомбардується операціями читання / запису.

Станом на Rails 4, сховище сесій Active Record було вилучено з основного фреймворку і тепер застаріло.

Якщо ви все ще хочете використовувати Active Record Session Store, він все ще доступний як дорогоцінний камінь .

Поточні практики сесії Rails

Щоб отримати більш актуальні найкращі практики для сесій Ruby on Rails, я раджу ознайомитися з останніми версіями Посібника з безпеки Ruby on Rails .


9

Я не вірю, що щось змінилося в тому, як хто-небудь на будь-якій платформі повинен обробляти сеанси на основі файлів cookie. Будьте скептичні щодо всього, що виходить за межі контролю сервера (файли cookie, повідомлення у формі тощо), що є загальним принципом веб-розробки.

Що стосується шифрування, я не знаю, чи щось змінилося на цьому фронті.

Щось, про що слід пам’ятати, із сховищем файлів cookie - це обмеження обсягу даних, і висновок, що ці дані будуть надсилатися по дроту під час кожного запиту, де як сховище бази даних передає лише ідентифікатор, а дані живуть на сервері .


4

FWIW, rails 3.1 пропонує працювати

rails generate session_migration

Однак це породжує точно таку ж міграцію, як

rake db:sessions:create

З тієї ж ноти, завдання граблі db:sessions:createзараз безпосередньо викликає session_migrationгенератор. task: create =>: середовище піднімає "Завдання недоступне для цієї бази даних (підтримка міграції відсутня)", якщо ActiveRecord :: Base.connection.supports_migrations? потрібні Rails / Generators Rails :: Generators.configure! вимагають 'rails / generators / rails / session_migration / session_migration_generator' Rails :: Generators :: SessionMigrationGenerator.start [ENV ["MIGRATION"] || "add_sessions_table"] кінець
похила

rake db:sessions:createІ rails generate session_migrationгенератори застаріли і видалено в Rails 4, тому що вони не дуже добре масштабуються для додатків з великою кількістю користувачів (занадто багато баз даних на читання і запис). Див. Rails 4.0, rake db: session: create .

2

За замовчуванням Rails мені здаються досить непоганими - CookieStore працює швидко і повинен охоплювати більшість випадків використання. Звичайно, ви обмежені 4 кб, і ваші дані будуть видимі користувачеві, але шлях Rails полягає у використанні сеансу лише для таких речей, як цілі ідентифікатори та основні рядкові значення. Якщо ви намагаєтесь зберігати об’єкти або конфіденційну інформацію в сеансі ви, мабуть, робите це неправильно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.