2012-02-20 4 views
8

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

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

Я спасаю секрет так:

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, так и при необходимости хранения содержимого сервера сеанса, и я использую сеанс для чего он предназначен. Но мой вопрос здесь заключается в том, чтобы хранить куки-файл, часть информации, которую я не хочу в сеансе, но мне все еще нужно, чтобы она была безопасной.

+0

Из интереса, почему его нужно хранить в cookie, а не на стороне сервера, где он будет по определению более безопасным? – Russell

+0

@ russell хорошо, вам нужно что-то хранить в браузере, не так ли? иначе вы не сможете идентифицировать его снова. Будь то фактические данные или идентификатор записи в таблице, это вопрос предпочтения и необходимость в отношении размера данных и других соображений. То, что я храню, уже является идентификатором записи в таблице. Я мог бы создать другую таблицу, но в этом случае это кажется пустой тратой. – Pablo

+0

Я добавил ответ, потому что я думаю, что изменение хранилища сеансов по умолчанию для использования БД даст вам необходимую вам безопасность с очень небольшими накладными расходами на создание таблиц и т. Д. – Russell

ответ

0

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

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

Однако, когда дело доходит до обеспечения безопасности, я всегда предпочитаю полагаться на решения , которые были проверены публично, а не сворачивать мои собственные. Пример: encrypted-cookies gem.

+0

Мне интересно, почему вы не использовали подписанные файлы cookie? (Поддерживается по умолчанию в Rails 3.x) –

+1

@KandadaBoggu Файлы cookie, обработанные encrypt_and_verify или зашифрованным куки-камнем (post 1.0), подписаны, но также зашифрованы. Было бы несерьезно, если бы этот фрагмент данных был разоблачен, но я скорее не думаю об этом и просто защищаю его, будучи зашифрованным, таким образом, непрозрачным для пользователя. – Pablo

+0

Это имеет смысл .. –

13
  • Установка для защищенного Cookie

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

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

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

+0

Я не хочу использовать сеанс. Мои сеансы относятся к домену (blah.example.com), тогда как эта часть данных предназначена для всей системы (.example.com), поэтому параметр домена при настройке. – Pablo

+0

Обновлен ответ. –

+0

Файлы cookie, установленные с .signed, также должны быть доступны с .signed. Поэтому ваш второй блок кода должен быть 'cookies.signed [: secret]'. –

1

Как говорит 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 

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

+0

Я не хочу использовать сеанс. Мои сеансы относятся к домену (blah.example.com), тогда как эта часть данных предназначена для всей системы (.example.com), поэтому параметр домена при настройке. – Pablo

Смежные вопросы