Текущие практики Rails-сессий


84

У кого-нибудь есть какие-нибудь "лучшие практики" для Rails и сессий? Типом сеанса по умолчанию для Rails 3 по-прежнему является CookieStore, верно? Некоторое время я использовал SqlSessionStore, и он работал хорошо, но я могу отказаться от этого в пользу CookieStore.

По-прежнему ли использовать CookieStore для конфиденциальной информации, даже с соленой информацией, или ее лучше хранить в БД?


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

Ответы:


102

Используйте базу данных для сеансов вместо файлов cookie по умолчанию, которые не следует использовать для хранения очень конфиденциальной информации.

Создайте сеансовую таблицу с

rake db:sessions:create

Запустите миграцию

rake db:migrate

Убедитесь, что вы также сказали rails использовать 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:createRails 4 исключен и удален, поскольку он плохо масштабируется для приложений с большим количеством пользователей (слишком много операций чтения и записи базы данных). См. Rails 4.0, rake db: sessions: 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, будут прозрачно считываться и зашифрованы, чтобы обеспечить плавный путь обновления.

Хранилище сессий Active Record устарело в Rails 4

Этот ответ теперь устарел для Rails 4. Хранилище сеансов Active Record устарело и удалено из Rails, поэтому следующие генераторы больше не будут работать:

  • rake db:sessions:create

  • rails generate session_migration

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

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

Начиная с Rails 4, хранилище сеансов Active Record было удалено из основной структуры и теперь устарело.

Если вы все еще хотите использовать хранилище сеансов Active Record, оно все еще доступно в виде драгоценного камня .

Лучшие практики текущей сессии Rails

Для получения более актуальных передовых практик для сеансов Ruby on Rails я советую вам ознакомиться с последними версиями Руководства по безопасности Ruby on Rails .


9

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

Что касается шифрования, я не знаю, изменилось ли что-нибудь в этом направлении.

При работе с хранилищем файлов cookie следует помнить об ограничении объема данных и о том, что эти данные будут отправляться по сети в каждом запросе, тогда как хранилище базы данных передает только идентификатор, а данные живут на сервере. .


4

FWIW, rails 3.1 предлагает запустить

rails generate session_migration

Однако это вызывает ту же миграцию, что и

rake db:sessions:create

В то же время задача rake db:sessions:createтеперь напрямую вызывает session_migrationгенератор. task: create =>: environment действительно вызывает сообщение «Задача недоступна для этой базы данных (без поддержки миграции)», если 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: sessions: create .

2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.