Насколько безопасно в Ruby on Rails использовать User.find_by_id (session [: user_id]) для идентификации пользователя? - PullRequest
2 голосов
/ 25 февраля 2011

Например, в Rails Restful Authentication используется

User.find_by_id(session[:user_id])

чтобы найти пользователя с первой попытки. Так

  1. Если сеанс хранится только с помощью файлов cookie (разве это не опция Rails для хранения всей информации о сеансе с использованием только файлов cookie?), То пользователь с идентификатором пользователя 12345 не может изменяет значение его cookie с 12345 на 12346 и притворяется другим пользователем?

как примечание стороны

I. Если сеанс выполняется с помощью session_id в виде файла cookie и просматривает информацию о сеансе в БД, то не может ли другой человек украсть файл cookie и выдать себя за этого пользователя? (украсть куки с помощью перехвата интернет-трафика)

II. Или, поскольку третий вариант - использовать файл cookie auth_token для проверки таблицы пользователей на наличие поля remember_token, может ли кто-то другой украсть этот файл cookie auth_token и притворяется этим пользователем?

Ответы [ 3 ]

3 голосов
/ 25 февраля 2011

Безопасность файлов cookie, перехват сеансов и многое другое рассматриваются в Руководстве по безопасности Ruby on Rails. Это необходимо прочитать.

1 голос
/ 25 февраля 2011

Из ответа jdl есть несколько параграфов:

Клиент может видеть все, что вы храните в сеансе, потому что оно хранится в виде открытого текста (фактически закодированного в Base64, поэтому не зашифрованного). Так что, конечно, вы не хотите хранить здесь какие-либо секреты. Чтобы предотвратить подделку хеша сеанса, дайджест вычисляется из сеанса с секретом на стороне сервера и вставляется в конец файла cookie.

Это означает, что безопасность этого хранилища зависит от этого секрета (и от алгоритма дайджеста, по умолчанию используется SHA512, который еще не был взломан). Поэтому не используйте тривиальный секрет, то есть слово из словаря, или слово, которое короче 30 символов. Положите секрет в вашем окружении. Rb:

 config.action_dispatch.session = {
  :key    => '_app_session',
  :secret => '0x0dkfj3927dkc7djdh36rkckdfzsg...'
}

примечание: я не уверен, что это config.action_dispatch.session или config.action_controller.session, или Rails 3.0.1 предлагает: ПРЕДУПРЕЖДЕНИЕ О УСТАРЕВАНИИ: config.action_controller.session устарело. Пожалуйста, используйте Rails.application.config.session_store вместо.

0 голосов
/ 25 февраля 2011

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

Обновление

Изменение значения по умолчанию для сохранения сеансасервер а не в куки

...