При использовании в качестве хранилища сеансов я заметил, что redis-rails сохраняет идентификатор сеанса в незашифрованном формате в файле cookie. Разве идентификатор сеанса не должен рассматриваться как защищенная информация и не должен быть раскрыт в незашифрованном файле cookie, чтобы предотвратить попытки захвата сеанса?
Безопасно ли использовать redis-rails в качестве хранилища сеансов?
- Нет, не должны, если они защищены при передаче, которую обычно покрывает https. 10.09.2017
- Сайт использует https, но все же кто-то может продолжать использовать случайные строки в качестве идентификатора сеанса, чтобы захватить чужой сеанс. Не могут? P.S. Могу ли я узнать, почему вопрос заминусован? 10.09.2017
- Нет, они не могут, если сеансы не предсказуемы или у них больше времени, чем возраст Вселенной. Идентификатор сеанса просто должен быть случайным, непредсказуемым и достаточно большим. 10.09.2017
- Теоретически вы могли бы сказать, что использование memcached/redis более безопасно, чем хранилище файлов cookie, поскольку инопланетяне с квантовыми суперкомпьютерами на основе super-unobtainium могут взломать шифрование. Эти же инопланетяне также могут угадать идентификатор сеанса при условии, что ваше приложение остается в сети и солнце не поглотит землю первым. 11.09.2017
- Возможно, вы также захотите изучить devise gem. 11.09.2017
Ответы:
Нет
Файл cookie идентификатора сеанса — единственный (достойный) способ связать клиента с сеансом. У клиента должно быть какое-то требование, которое он может передать вместе с запросом, чтобы мы могли его идентифицировать.
Это применимо независимо от того, используете ли вы CookieStore, Redis, ActiveRecord или memcached.
Шифрование идентификатора сеанса с фиксированной солью или без соли не даст абсолютно ничего, кроме пустой траты времени, поскольку злоумышленник в любом случае имеет доступ к файлу cookie при атаке «человек посередине» или XSS.
Если бы вы использовали соль, вам также пришлось бы связать ее с пользователем. Теперь у вас две проблемы вместо одной.
Хотя вы можете использовать множество новых подходов, таких как соление с пользовательским агентом, ip или что-то еще, что, как вы думаете, вы знаете о клиенте, преимущества безопасности невелики.
Как сказал @pvg:
Идентификатор сеанса просто должен быть случайным, непредсказуемым и достаточно большим.
Значимыми способами защиты сеанса являются:
- Используйте https для предотвращения атак «человек посередине».
- Вызовите
reset_session
при входе и выходе пользователей, чтобы избежать фиксации сеанса. - Дезинфицируйте пользовательский ввод, чтобы избежать XSS.