Печенье против сессий

189

Я начал использовать PHP пару месяцев назад. Ради создания системы входа в систему для моего веб-сайта я прочитал о файлах cookie и сеансах и их различиях (файлы cookie хранятся в браузере пользователя и сеансах на сервере). В то время я предпочел куки-файлы (а кому не нравятся куки-файлы ?!) и просто сказал: «кого это волнует? У меня нет ничего хорошего с хранением их на моем сервере», поэтому я решил использовать куки-файлы для мой дипломный проект бакалавра. Однако, после выполнения большей части моего приложения, я услышал, что для конкретного случая хранения идентификатора пользователя сеансы более подходящие. Поэтому я начал думать о том, что мне сказать, если жюри спросит меня, почему вы используете куки вместо сессий? Я имею именно эту причину (что мне не нужно хранить внутреннюю информацию о пользователе).? или это нечто большее?
Не могли бы вы рассказать мне о преимуществах / недостатках использования файлов cookie для сохранения идентификатора пользователя?

Спасибо вам всем в StackOverflow!

Наджиб Мами
источник
2
Оба метода хранят данные . Cookies делают это на стороне клиента, то есть на хранилище устройств ваших посетителей. Сеансы являются умным «расширением» в том смысле, что они хранят только уникальный идентификатор на стороне клиента и все фактические данные на стороне сервера. Когда они получают уникальный идентификатор из cookie-файла клиента, они знают, какие данные загрузить на сервер. В большинстве случаев сеансы будут тем, что вам нужно. Кстати, вы можете управлять обоими с github.com/delight-im/PHP-Cookie более современным способом.
прощай
Кроме того, несколько лет назад ядро ​​WordPress отказалось от использования сессий и теперь использует исключительно куки . Интересный. Интересно, сделали ли они это, чтобы упростить развертывание на множестве серверов с балансировкой нагрузки и / или уменьшить количество случайных выходов из строя из-за сбора мусора в сеансе.
Саймон Ист

Ответы:

230

Концепция хранения постоянных данных при загрузке страниц для веб-посетителя. Файлы cookie хранятся прямо на клиенте. Сессии используют куки в качестве своего рода ключа, чтобы связать с данными, которые хранятся на стороне сервера.

Предпочтительно использовать сеансы, потому что фактические значения скрыты от клиента, и вы контролируете, когда истекает срок действия данных и они становятся недействительными. Если все это основано на куки, пользователь (или хакер) может манипулировать своими данными куки и затем воспроизводить запросы на ваш сайт.

Изменить: я не думаю, что есть какие-либо преимущества использования куки, кроме простоты. Посмотрите на это с другой стороны ... Есть ли у пользователя какая-либо причина знать свой номер ID? Как правило, я бы сказал, нет, пользователь не нуждается в этой информации. Выдача информации должна быть ограничена на основе необходимости знать. Что если пользователь изменит свой файл cookie на другой идентификатор, как отреагирует ваше приложение? Это риск для безопасности.

До того, как сессии были в моде, у меня была своя реализация. Я сохранил уникальное значение cookie на клиенте и сохранил свои постоянные данные в базе данных вместе с этим значением cookie. Затем при запросах страниц я сопоставил эти значения и получил свои постоянные данные, не позволяя клиенту контролировать, что это было.

Fosco
источник
29
@JiminyCricket Я не думаю, что это правда ... если это так, никто не использовал бы переменные сеанса для хранения текущего вошедшего в систему пользователя - и все так и делают. Это было бы огромным риском для безопасности. Совершенно уверен, что обычно идентификатор сеанса сохраняется в виде файла cookie на клиентском компьютере, а затем сопоставляется на стороне сервера с данными сеанса. Сервер обычно не контролирует сеансы через IP-адрес, а через значение cookie.
Джон М.
1
Недавно я только начал снова использовать только файлы cookie, просто потому, что из-за сеансов страницы не загружаются, если в тот же сеанс в данный момент выполняется другой файл, если только вы не вводите предисловие на каждой странице, session_write_close();когда вам это нужно. Прокрутить свой собственный уникальный идентификатор и сопоставить его с обычными cookie-файлами не так уж сложно, и все страницы будут красивыми и быстрыми.
Брайан Лейшман
Как вы думаете, я должен использовать сеансы для аутентификации? Есть ли какие-либо угрозы безопасности? Как насчет хакера, пытающегося изменить свой идентификатор сеанса, как будет отвечать сервер (предположим, что предполагаемый идентификатор сеанса действителен)?
O-BL
Используйте сессию, а затем 2FA как сессия может быть взломана.
Закир Саджиб
120

Основные идеи, чтобы различать эти два.

сессия:

  1. ПИН хранится на сервере (т.е. на стороне сервера)
  2. Безопаснее (из-за 1)
  3. Срок действия не может быть установлен, переменные сеанса истекут, когда пользователи закроют браузер. (в настоящее время он хранится в течение 24 минут по умолчанию в php)

Печенье:

  1. IDU хранится в веб-браузере (т.е. на стороне клиента)
  2. Не очень безопасно, так как хакеры могут получить и получить вашу информацию (из-за 1)
  3. Срок действия может быть установлен (см. Setcookies () для получения дополнительной информации)

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

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

Reyske
источник
6
Знайте: это НЕ хороший ответ. Все начинается вполне нормально, но все путает и заканчивается дезинформацией. Это не объяснение сеанса против куки. Это объяснение сеанса против сеанса + сессионный cookie. Одно только печенье не является предпочтительным по указанным причинам. Сеансы + сеансовые куки предпочтительны по указанным причинам.
Маркус
Другая ошибка заключается в том, что вы влияете на время жизни сеанса через конфигурацию PHP.
Маркус
1
Сеансы все еще устанавливают cookie в браузере пользователя, поэтому это объяснение на стороне сервера и клиента не является точным
Zalaboza
истечение сессий может быть легко установлено любым приложением. 3-й пункт неверен. Кроме того, вы забыли количество данных, которые могут быть сохранены в cookie против сеанса. Это более важный момент
saran3h
1
Что означает ПИН?
Саймон Ист
45
SESSIONS ENDS WHEN USER CLOSES THEIR BROWSER,

COOKIES END DEPENDING ON THE LIFETIME YOU SET FOR IT. SO THEY CAN LAST FOR YEARS

Это главное различие в вашем выборе,

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

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

Теперь php по умолчанию очищает сеансы каждый интервал, а также соглашение об именах сессии делает его автоматически истекающим. Кроме того, браузеры не будут сохранять cookie-файл, содержащий идентификатор сеанса, после закрытия браузера или очистки истории.

Важно отметить, что в настоящее время браузеры также поддерживают другой тип механизмов хранения, таких как LocalStorage, SessionStorage и другие механизмы webdb, которые код JavaScript может использовать для сохранения данных на вашем компьютере, чтобы запомнить вас. Например, если вы откроете консоль javascript внутри Facebook и наберете «localStorage», вы увидите все переменные, которые Facebook использует для запоминания вас без файлов cookie.

Zalaboza
источник
16
На самом деле, по умолчанию сеанс длится до тех пор, пока пользователь не закроет свой браузер, НО это можно изменить в файле php.ini, изменив 0 в session.cookie_lifetime = 0 на количество секунд, которое вы хотите, чтобы сеанс длился, или используя session_set_cookie_params ().
DOK
1
Дополнительная полезная информация, такой вопрос, который получает много ответов .. здорово, еще раз спасибо DOK!
Наджиб Мами
1
Также имейте в виду, что файлы сессий единой точки сбоя могут создавать. Когда даже самая маленькая атака в стиле dos происходит через прокси, ip switcher или зомби, на жестком диске вашего сервера или ssd создается файл сеанса. Если вы не можете идти в ногу с чтением записей, ваш сайт будет закрыт.
Шон Э Картер,
может кто-нибудь сказать: «СЕССИИ ЗАВЕРШАЮТСЯ, КОГДА ПОЛЬЗОВАТЕЛЬ ЗАКРЫВАЕТ СВОЙ БРАУЗЕР» 1. Что делать, если пользователь перемещается по странице со страницы ... затем возвращается, не закрывая браузер. 2. что если у них открыто несколько окон / вкладок браузера, указывающих на один и тот же сайт? некоторые веб-приложения на работе запутываются в этой ситуации, но я не знаю, какой тип файлов cookie они используют.
jcansell
1
@jcansell хорошо, cookie не будет смущен несколькими вкладками или удалением, в таком случае наиболее вероятно, что эти веб-приложения использовали локальное хранилище / хранилище сессий для сохранения данных с использованием javascript
Zalaboza
20

когда вы сохраняете #ID в качестве файла cookie для распознавания вошедших в систему пользователей, вы фактически показываете данные пользователям, которые не связаны с ними. Кроме того, если третья сторона попытается установить случайные идентификаторы в качестве данных cookie в своем браузере, она сможет убедить сервер в том, что они пользователь, а на самом деле нет. Это отсутствие безопасности.

Вы использовали куки, и, как вы сказали, вы уже завершили большую часть проекта. Кроме того, cookie имеет право оставаться надолго, в то время как сеансы заканчиваются быстрее. Так что сессии не подходят в этом случае. На самом деле многие известные и популярные веб-сайты и службы используют cookie, и вы можете оставаться в системе в течение длительного времени. Но как вы можете использовать их метод для создания более безопасного процесса входа?

Идея такова: вы можете помочь в использовании файлов cookie: если вы используете случайные ключи вместо идентификаторов для распознавания вошедших в систему пользователей, во-первых, вы не пропускаете свои первичные данные случайным пользователям, а во-вторых, если вы рассматриваете случайные достаточно большой ключ, любому будет сложнее угадать ключ или создать случайный. например, вы можете сохранить ключ длиной 40, например, в браузере пользователя: «KUYTYRFU7987gJHFJ543JHBJHCF5645UYTUYJH54657jguthfn», и для кого-то будет меньше шансов создать точный ключ и притвориться кем-то другим.

Макан Тайеби
источник
1
Хорошее объяснение. Я использую GUID в токене для распознавания отдельных пользователей.
Картик
18

Короткий ответ

Правила упорядочены по приоритету:

  • Правило 1. Никогда не доверяйте вводу пользователя: куки не безопасны. Используйте сеансы для конфиденциальных данных.
  • Правило 2. Если постоянные данные должны оставаться, когда пользователь закрывает браузер, используйте куки.
  • Правило 3. Если постоянные данные не должны оставаться, когда пользователь закрывает браузер, используйте сеансы.
  • Правило 4. Читайте подробный ответ!

Источник: https://www.lucidar.me/en/web-dev/sessions-or-cookies/


Подробный ответ

Печенье

  • Файлы cookie хранятся на стороне клиента (в браузере посетителя).
  • Файлы cookie не являются безопасными: их довольно легко читать и записывать.
  • При использовании файлов cookie вы должны уведомлять посетителей в соответствии с европейским законодательством (GDPR).
  • Срок действия может быть установлен, но пользователь или браузер может изменить его.
  • Пользователи (или браузер) могут (быть настроены) отказаться от использования куки.

сессии

  • Сессии хранятся на стороне сервера.
  • Сессии используют куки (см. Ниже).
  • Сессии безопаснее, чем куки, но не являются неуязвимыми.
  • Срок действия задается в конфигурации сервера (например, php.ini).
  • Время истечения по умолчанию составляет 24 минуты или когда браузер закрыт.
  • Истечение срока действия сбрасывается, когда пользователь обновляет или загружает новую страницу.
  • Пользователи (или браузер) могут (быть настроены) отказаться от использования куки, поэтому сеансы.
  • Юридически, вы также должны уведомлять посетителей о куки, но отсутствие прецедента еще не ясно.

Соответствующий выбор

Сессии используют куки! Данные сеанса хранятся на стороне сервера, но UID хранится на стороне клиента в файле cookie. Это позволяет серверу сопоставлять заданного пользователя с правильными данными сеанса. UID защищен и его трудно взломать, но он не является неуязвимым. Для конфиденциальных действий (изменение электронной почты или сброс пароля) не полагайтесь ни на сеансы, ни на файлы cookie: запросите пароль пользователя для подтверждения действия.

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

Данные « Помни меня» должны храниться в файлах cookie, иначе данные будут потеряны, когда пользователь закроет браузер. Однако не сохраняйте пароль или личные данные пользователя в cookie-файле «запомнить меня». Сохраните пользовательские данные в базе данных и свяжите эти данные с зашифрованной парой ID / ключ, хранящейся в cookie.

После рассмотрения предыдущих рекомендаций, наконец, следующий вопрос, который поможет вам выбрать между куки и сессиями:

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

  • Если ответ да , используйте куки .
  • Если ответ нет , используйте сессии .
Фифи
источник
13

На самом деле, сессия и куки не всегда разные вещи. Часто, но не всегда, сессия использует куки.

Здесь есть несколько хороших ответов на ваш вопрос. Поскольку ваш вопрос конкретно касается сохранения пользовательского IDU (или идентификатора), я не думаю, что он является дубликатом этих других вопросов, но их ответы должны помочь вам.

куки против сессии

Cache VS Session VS куки?

В чем разница между сессией и cookie?

ДОК
источник
10

Я лично использую и куки, и сессию.

Файлы cookie используются только когда пользователь нажимает на кнопку «запомнить меня» . а также куки-файлы шифруются, а данные дешифруются только на сервере. Если кто-то попытается отредактировать куки, наш дешифратор сможет обнаружить его и отклонить запрос.

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

Спасибо,

Мухаммед Санаулла
источник
2

Сессия и Cookie не одно и то же.

Сессия используется для хранения информации с веб-страниц. Обычно у веб-страниц нет памяти для хранения этой информации. Но используя мы можем сохранить необходимую информацию.

Но Cookie используется для идентификации пользователей. Используя cookie, мы можем хранить данные. Это небольшая часть данных, которые будут храниться в веб-браузере пользователя. Таким образом, каждый раз, когда пользователь просматривает браузер в следующий раз, отправляет обратно информацию о файлах cookie на сервер для получения предыдущих действий.

Кредиты: сессия и печенье

user3824494
источник
Что делать, если пользователь отключил куки? Как cookie идентифицируют пользователя?
SohailRajput
1

Сеансы позволяют хранить отдельные фрагменты информации, как при использовании файлов cookie, но данные хранятся на сервере, а не на клиенте.

fuddin
источник
0

Как говорили другие, сессии являются умными и имеют больше преимуществ скрывать информацию от клиента.

Но у Cookie все еще есть по крайней мере одно преимущество : вы можете получить доступ к своим Cookies из Javascript (например, ngCookies ). В сеансе PHP вы не можете получить к нему доступ за пределами сценария PHP.

Камалаканнан Дж
источник
1
Вы можете .. Не напрямую, конечно, однако вы можете получить к нему доступ через некоторый ajax-запрос к сценарию, который возвращает данные сеанса. Но я не уверен, что ты должен.
100
0

Я выберу сессию, в первую очередь сессия более безопасна, чем куки, куки - это данные сайта клиента, а сессия - данные сайта сервера. Cookies используются для идентификации пользователя, потому что это небольшие кусочки кода, которые встроены в мой сервер через браузер компьютера пользователя. С другой стороны, Session поможет вам защитить вашу личность, потому что веб-сервер не знает, кто вы, потому что HTTP-адрес меняет состояние с 192.168.0.1 на 765487cf34ert8ded… или что-то еще, нумерация с помощью методов GET и POST. Сеанс хранит данные пользователя в сеансе с уникальным идентификатором, который даже не совпадает. Сессия хранит одну пользовательскую информацию на всех страницах одного приложения. Срок действия файлов cookie устанавливается с помощью setcookies (), тогда как срок действия сессии не устанавливается, он истекает, когда пользователь отключает браузеры.

Васик Махмуд В.М.
источник
0

Сеанс - это группа информации на сервере, которая связана с информацией cookie. Если вы используете PHP, вы можете проверить сессию. сохранить _ путь к месту и на самом деле "увидеть сессии". Файл cookie - это фрагмент данных, отправляемых и возвращаемых клиентами. Файлы cookie часто используются для облегчения сеансов, поскольку они сообщают серверу, какой клиент обработал какой сеанс. Есть и другие способы сделать это (запрос строки магии и т. Д.), Но куки, вероятно, наиболее распространены для этого.

Megersa
источник