Отключение: cookie_only в хранилище сессии в Rails 3? - PullRequest
1 голос
/ 08 декабря 2010

У нас есть приложение Rails, которое связывается с приложением для iPhone на основе PhoneGap.Мы находимся в процессе обновления приложения Rails с Rails 2.3.5 до 3. Из-за некоторых проблем, заставляющих PhoneGap хорошо работать с файлами cookie Rails, приложение Rails (предварительное обновление) было настроено с :cookie_only, установленным в false:

ActionController::Base.session = {
    :key => '_our_key',
    :secret => 'ourreallyreallylongsecret',
    :cookie_only => false
}

Эта конфигурация была переведена для Rails 3 следующим образом:

OurApp::Application.config.session_store :cookie_store, :key => '_our_key'
OurApp::Application.config.secret_token = 'ourreallyreallylongsecret'

Проблема в том, что я не могу понять, как использовать опцию :cookie_only в Rails 3. Теперь,Я понимаю, что установка :cookie_only в false - действительно плохая идея и приводит к неприятным эксплойтам по фиксации сессии.Мы, безусловно, планируем исправить это в будущем.Однако существующее приложение для iPhone полагается на это поведение, чтобы функционировать вообще.Поэтому мне нужно, чтобы приложение iPhone работало в течение короткого времени, пока мы пересматриваем сессионные приложения iPhone.

Глядя на исходный код Rails для CookieStore, похоже, что они действительно этого не делают.хотим, чтобы мы больше могли использовать эту опцию:

def initialize(app, options = {})
    super(app, options.merge!(:cookie_only => true))
    freeze
end 

Мы обезьяны исправили источник Rails для слияния в :cookie_only => false, что не сработало.Мы даже зашли так далеко, что просто установили @cookie_only = false в методе AbstractStore initilize, но его просто проигнорировали.Кажется, что реализация CookieStore больше не чтит @cookie_only.

Неужели нет никакого способа использовать эту функциональность в Rails 3?Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2015

Это очень легко сделать и не требует каких-либо исправлений или изменений в коде Rails, вам просто нужен инициализатор с:

Rails.application.config.session_store :active_record_store, cookie_only: false

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

Перезапустите сервер, откройте другой браузер, убедитесь, что в этом другом браузере нет cookie, и вы можете получить доступ к http://your.server/protected/path?session_key=valid_session_id

Имейте в виду, что в зависимости от того, как вы используете этот механизм, кому-то будет немного проще украсть session_id у другого пользователя.Но если вы используете его с умом, это ничем не отличается от переноса session_in в cookie.

База кода: Rack :: Session :: Abstract :: ID # extract_session_id https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb#L272

0 голосов
/ 22 декабря 2010

Если кто-то еще является той же лодкой, с которой я был, похоже, что невозможно использовать опцию :cookie_only в Rails 3 без серьезного изменения самого кода Rails. И на то есть веские причины, потому что его использование - плохая идея с точки зрения безопасности.

Если у вас также есть проблемы с использованием файлов cookie в PhoneGap на iPhone, взгляните на этот вопрос, это решило нашу проблему и избавило от необходимости использовать опции :cookie_only: phonegap: проверка подлинности на основе файлов cookie (PHP ) не работает [веб-просмотр]

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