Хранение зашифрованного куки с Rails - PullRequest
8 голосов
/ 20 февраля 2012

Мне нужно хранить небольшой фрагмент данных (менее 10 символов) в cookie в Rails, и мне нужно, чтобы он был безопасным.Я не хочу, чтобы кто-либо мог прочитать эту часть данных или внедрить свою собственную часть данных (поскольку это открыло бы приложение для многих видов атак).Я думаю, что шифрование содержимого файла cookie - это путь (я должен также подписать его?).Каков наилучший способ сделать это?

Сейчас я делаю это, что выглядит безопасным, но многие вещи выглядели безопасными для людей, которые знали о безопасности гораздо больше меня, а потом было обнаружено, что это не так.Это действительно безопасно.

Я сохраняю секрет следующим образом:

encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token)
cookies[:secret] = {
  :value => encryptor.encrypt(secret),
  :domain => "example.com",
  :secure => !(Rails.env.test? || Rails.env.development?)
}

и затем читаю это так:

encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token)
secret = encryptor.decrypt(cookies[:secret])

Этобезопасности?Есть ли лучшие способы сделать это?

Обновление : я знаю о сеансе Rails и о том, насколько он безопасен, подписывая cookie-файл и, при необходимости, сохраняя содержимое серверной части сеанса иЯ использую сессию для чего она нужна.Но мой вопрос здесь касается хранения cookie-файла, части информации, которую я не хочу видеть в сеансе, но мне все еще нужно, чтобы она была безопасной.

Ответы [ 3 ]

13 голосов
/ 20 февраля 2012
  • Установка безопасного cookie

    cookies.signed[:secret] = {
     :value => "foo bar",
     :domain => "example.com",
     :secure => !(Rails.env.test? || Rails.env.development?)
    }
    
  • Доступ к cookie

    cookies.signed[:secret] # returns "foo bar"
    

Файл cookie подписаниспользуя ActionController :: Base.cookie_verifier_secret .Вы можете установить cookie_verifier_secret в файле инициализатора.

1 голос
/ 21 февраля 2012

Как говорит KandadaBoggu, похоже, что вам нужна переменная сеанса, а переменные сеанса по умолчанию шифруются и хранятся в файлах cookie.Тем не менее, если вы посмотрите на содержимое config/initializers/session_store.rb, вы найдете что-то вроде следующего:

 # Be sure to restart your server when you modify this file.
 MyRailsApp::Application.config.session_store :cookie_store, :key => '_my_rails_app_session'

 # Use the database for sessions instead of the cookie-based default,
 # which shouldn't be used to store highly confidential information
 # (create the session table with "rails generate session_migration")
 # MyRailsApp::Application.config.session_store :active_record_store

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

0 голосов
/ 21 февраля 2012

Я повторно публикую ответ JacobM , который он удалил, потому что это был правильный ответ и указал мне правильное направление.Если он его удалит, я удалю его и выберу его как лучший ответ.

Прежде всего, если вы используете encrypt_and_verify вместо encrypt, он подпишет для вас cookie.

Однако, когда речь заходит о безопасности, я всегда предпочитаю полагаться на решения, которые были проверены публично, а не на свои собственные.Примером может служить зашифрованный файл cookie 1011 *.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...