Rails 4: Срок действия сеанса?
Я только что переключился с Rails 3.2 на Rails 4. Я стараюсь, чтобы как можно быстрее реагировать на проблемы безопасности, и сейчас я беспокоюсь о сессиях. Похоже, что Rails 4 отказался от поддержки действительно чего-то, кроме EXCEPT-сессий на основе файлов cookie, но похоже, что невозможно предотвратить ведение сессий на основе файлов cookie. Я читал несколько статей, но это один из самых официальных: http://guides.rubyonrails.org/security.html#session-expiry. Обратите внимание, как они указывают, что это проблема для сеансов на основе файлов cookie, затем они дают исправление для сеансов на базе базы данных (которые, по-видимому, теперь устарели).
Я действительно смущен. Я хочу, чтобы предотвратить, чтобы злоумышленник получал cookie, который дает ему постоянный доступ к моему сайту, защищенному сайтом. Очевидно, я могу установить: expire_after в initializers/session_store.rb, но если я ошибаюсь, это просто задает истечение срока действия cookie, который является клиентской стороной и легко изменен злоумышленником, поэтому сеанс может жить вечно. Конечно, я могу улучшить ситуацию, заставив SSL, используя безопасные куки файлы и форсируя только HTTP, но это никогда не будет полной защитой, пока я не смогу обеспечить соблюдение срока действия сеанса.
Как я могу решить эту проблему, когда Rails осуждает единственные способы иметь сеансы на стороне сервера?
Я знаю, что активные сеансы записи были перенесены в драгоценный камень и по-прежнему доступны, но факт остается фактом, что он устарел. Решение должно быть возможным без введения дополнительных зависимостей или, по крайней мере, без использования устаревших функций.
Ответы
Ответ 1
У Rails есть "защищенные от несанкционированного доступа" сеансовые файлы cookie. Чтобы предотвратить фальсификацию хеша сессии, дайджест вычисляется из сеанса с секретностью на стороне сервера и вставляется в конец файла cookie. Просто убедитесь, что у вас длинный секрет. Если вы хотите периодически reset, все сеансы пользователя изменяют ваш секрет.
Чтобы ответить на ваш вопрос, если вы хотите добавить дополнительный тайм-аут к данным сеанса, которые вы могли бы сделать:
session[:user_id] = user.id
session[:expires_at] = Time.current + 24.hours
Затем, при аутентификации пользователей, выполните:
if session[:expires_at] < Time.current
# sign out user
end
Надеюсь, что это поможет.
Ответ 2
На самом деле рельсы наследуются от Rack::Session::Cookie
.
Таким образом, вы можете настроить параметр expire_after
в session_store.rb
.
Sqore::Application.config.session_store(
:cookie_store,
key: '_name_session',
expire_after: 24.hours
)
Ответ 3
добавьте это в свой прикладной контроллер: before_filter: session_expires,: except = > [: login,: logout] before_filter: update_session_time,: except = > [: login,: logout]
def session_expires
@time_left = (session[:expires_at] - Time.now).to_i
unless @time_left > 0
reset_session
flash[:error] = 'Lorem Ipsum.'
redirect_to :controller => 'foo', :action => 'bar'
end
end
def update_session_time
session[:expires_at] = 60.minutes.from_now
end