Подтвердить что ты не робот

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 осуждает единственные способы иметь сеансы на стороне сервера?

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

4b9b3361

Ответ 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