Сохранение переменных сеанса пользователя в файле vs в базе данных

У меня есть приложение php, и я сохраняю переменные сеанса для пользователя, используя $_SESSION. Есть ли какое-то конкретное преимущество в его хранении в базе данных?

Я ищу надежную/хорошо исследованную статью, в которой больше говорится об этом. Я еще ничего не смог найти.

Ответ 1

В какой-то момент вам придется хранить что-то в сеансе. Будь то все переменные сеанса или только идентификатор строки в таблице сеансов. В этом случае было бы довольно легко изменить идентификатор, хранящийся в плохо зашифрованном сеансе, и захватить другой сеанс.

Рассмотрим это:

Полный вариант сеанса. У этого есть Идентификатор Пользователя, Имя пользователя и зашифрованный и хешированный пароль, хранящиеся так, что каждый раз, когда страница вызвана, он проверяет мой логин. Чтобы захватить чужую сессию, мне нужно будет узнать их идентификатор пользователя, имя пользователя и пароль Hash и сможете преодолеть связанные с ним шифрование.

Session + DB Option. Это просто имеет идентификатор сеанса, который ссылается на строку в базе данных. Все, что мне нужно сделать, чтобы изменить сеанс, который я хочу, это разбить шифрование на сеансе и сказать добавить его в идентификатор сеанса. Затем я был бы аутентифицирован как пользователь, который вошел после меня.

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

Ответ 2

Преимущество, которое вы сохраняете в базе данных, состоит в том, что данные существуют до тех пор, пока вы хотите, чтобы они существовали.

Ваш браузер уничтожит сеанс в соответствии с тем, как он настроен, что делает его немного ненадежным. Однако я не могу найти статью об этом, но это то, что я использую в качестве конвенции для такой ситуации.

Любые данные, которые необходимо хранить в долгосрочной перспективе, такие как данные пользователя и активность, которые я храню в базе данных. Любые данные, относящиеся только к текущему рабочему пространству, такие как вход в сайт и публикация нескольких комментариев и т.д., Могут храниться в сеансе. Например, я храню данные аутентификации пользователя в сеансе, чтобы постоянно проверять, вошел ли пользователь в систему или нет, и перенаправить его/ее на правильную страницу.

Это работает, когда вы проверяете права доступа во всем приложении.

Для меня гораздо безопаснее хранить данные пользователя в базе данных, потому что он не может быть публично доступен, как $_SESSION.

Пожалуйста, не соглашайтесь со мной, если хотите.

Ответ 3

Я бы сказал, что сохранение в базе данных лучше. Потому что

  • Когда вы размещаете свой сайт с общим хостом  PHP использует тот же путь для хранения сеансов для всех пользователей, где-то не в ваших папках.

  • Вы можете легко отслеживать пользователей и их статус.

  • Для приложений, работающих на нескольких серверах, вы можете хранить все данные сеанса в одной базе данных.

Эта статья может помочь.

Ответ 4

Ну, это вопрос на века. Лично из того, что я узнал в свое время. Если ваш сайт не начнет быстро развиваться в массовом масштабе, где вам нужно начать использовать несколько серверов для различных аспектов системы, таких как балансировка нагрузки, где у вас много работающих зеркальных систем. Или нужно немного улучшить производительность для более заполненной системы, преимущества использования сеансов, связанных с БД, или сеансов на основе файлов действительно не отличаются друг от друга. Предоставьте мне, я мог ошибаться, это просто мое личное восприятие из моего собственного опыта. Точно так же, как вы, я никогда не находил статей, сообщений, других, которые действительно ставили либо на тест бок о бок, а я даже не думаю, что нашел что-то, что действительно поместило бы на тестовый стенд отдельно. Лично я просто иду с тем, что когда-либо было (или желанием моего клиента), как правило, я просто придерживаюсь собственного файла на основе сеансов.

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

Ответ 5

Из моего краткого опыта вы должны хранить в $_SESSION только данные, которые вам НЕ нужно обновлять во всех сеансах, открытых уникальным пользователем на разных устройствах. (Мобильный/настольный/и т.д.).

Другими словами, данные, которые вы уверены, никогда не будут меняться, как userID.

Например, я сохранил путь изображения профиля пользователя в $_SESSION, и это привело к странному опыту пользователя. При изменении изображение профиля на рабочем столе, оно не обновляло изображение профиля для пользователя на его мобильном телефоне. Однако другие пользователи увидели новую картину. Действительно, путь был обновлен в БД, но не в $_SESSION. Вход в систему и вход в систему ничего не изменили.

Помните, что поведение по умолчанию - это то, что $_SESSION, переданное с cookie, будет отличаться для каждого браузера, даже если это тот же самый пользователь, который зарегистрировался. Вам нужно будет сделать session_destroy(), чтобы избежать застревания старых данных.

Очень временные данные могут храниться в $_SESSION, как я полагаю.

NB: основная необходимость глобальной сессии, из этих аргументов, состоит в том, чтобы иметь доступные глобальные переменные