2010-07-30 2 views
4

Я создавал систему входа в систему с PHP, и я задавался вопросом: зачем нужны сессии?Системы входа в систему: зачем нужны сеансы?

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

Может ли кто-нибудь сказать мне, в чем причина использования сеансов в каждой (достаточно безопасной) системе входа?

+0

идентификаторы сеансов, чтобы избежать повторного использования имени пользователя и пароля пользователя после успешной аутентификации объекта (успешный вход в систему), вместо того, чтобы повторно запрашивать у пользователя свое имя пользователя и пароль для каждого запроса, который он отправил на ваш сервис, вы просто нужно проверить связанный с ним session_id. (да, вы также можете добиться того же, используя его имя пользователя и пароль). в этом случае последний подход имеет более серьезные риски для безопасности. – ultrajohn

+0

Вы правы в том, что риск разоблачения пароля в файле cookie, учитывая очень сильный хеш, может быть довольно низким. Но зачем беспокоиться? Просто используйте случайно сгенерированный идентификатор сеанса, и никогда не будет шансов, что пароль может быть «unhashed». Кроме того, вы должны повторно использовать существующую систему аутентификации, когда это возможно, потому что, действительно, она сложна. Например, взгляните на https://github.com/delight-im/PHP-Auth, который является как агрегированным, так и агрегированным по базе данных. – caw

ответ

3

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

+0

Хорошая точка. Но если вы нажмете «Запомнить меня» (как это делает большинство пользователей), тогда риск не будет примерно таким же? – user406925

+1

Если кто-то крадет куки-файл, то в следующий раз, когда вступает реальный пользователь, его идентификатор сеанса больше не будет работать, и поэтому ему будет предложено ввести логин. Как только он войдет в систему с именем пользователя/паролем, идентификатор сеанса crook больше не будет работать. – supercat

+1

Кнопки «Запомнить меня» обычно просто означают, что cookie сеанса НЕ истекает (например, становится постоянным), когда браузер закрыт. В этом нет ничего волшебного. –

0

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

+3

Файлы cookie и сеансы на самом деле не сопоставимы - файлы cookie - один из способов реализации сеансов (другой - в строке запроса URL-адресов сайтов). Сессии могут истекать через год, если вы захотите. – Nick

+0

Как отметил Ник, сеансы могут длиться дольше, и срок действия файлов cookie может истекать, когда браузер закрыт (или даже раньше), поэтому продолжительность не кажется значительным аргументом. @Nick Я не пытаюсь сравнить два способа реализации сеансов, я пытаюсь сравнить сеансы на основе файлов cookie с аутентификацией без проверки на основе cookie. – user406925

+0

Поскольку 99,9% реализаций PHP-сессий зависят от куки-файлов, система сеансов на основе файлов cookie и система без сеанса на основе файлов cookie будут иметь те же самые ограничения, когда речь идет о информации cookie (срок действия и т. Д.). Разница не в том, где хранится информация (оба хранят файл cookie на клиентской машине), там хранится конфиденциальная информация (с сеансами, на стороне сервера и без сеанса на стороне клиента) ... – ircmaxell

0

Потому что это более безопасный период.

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

+0

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

+0

encripted decryptable data? интересно ... но стоит ли шифровать данные в cookie? когда вы можете использовать сеансы – Pablo

1

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

Если вы также привязаны к IP-адресу, вы можете сделать его более безопасным.

Или вы можете просто войти в систему для каждой страницы, к которой они хотят перейти.

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

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

Идентификаторы сеансов проще, чем javascript делать все, поэтому большинство людей выбирает сеансы, но вам не обязательно.

0

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

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

  • Сессионные куки имеют более короткий срок службы.
  • Пользователи часто перерабатывают имя пользователя/пароли между сайтами, это может выставить их больше, если их учетные данные будут перехвачены.
  • Сессия может фактически не позволять пользователю выполнять те же действия, что и имя пользователя/пароль; например, сайт может потребовать от пользователя повторного ввода своих учетных данных в какой-то момент.
  • Сайт может ограничить срок действия сеанса одним конкретным IP-адресом.

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

+1

Я согласен с большинством вещей, которые вы сказали, но я думаю, что использование «абсолютно безопасного» просто слишком сильное слово для использования в контексте безопасности, просто мысль! :) – ultrajohn

+0

1. Не всегда 2. Итак, вы в основном говорите, что хеши небезопасны (даже с солью и т. Д.), И мы не должны им доверять? 3. & 4. Хорошие баллы. Итак, причина в том, что сеансы более расширяемы? – user406925

+0

@ultra Я перефразировал его. Я зарезервирую термин «безоговорочно безопасный» для одноразовых прокладок: p – Artefacto

1

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

  • Вы передаете конфиденциальную информацию на каждый запрос HTTP.
  • Чтобы проверить учетные данные, которые вы, возможно, должны выполнить запрос к базе данных, и вы делаете это снова и снова и снова.
  • Вы должны проверить учетные данные, чтобы узнать, от кого запрос.
  • Одновременные соединения с одинаковыми учетными данными будут обмениваться данными [см. Добавление].

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

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

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

Добавление

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

+0

Спасибо за обширный ответ. 1. Но он зашифрован :) 2. Это верно и для сессий, хранящихся в db, и многие, многие системы используют это. 3. Вы должны проверить сеанс, чтобы узнать, откуда приходит запрос. Точка? 4. Я этого не понимаю. Не могли бы вы уточнить? – user406925

+0

@lucrezia: что я имею в виду в 3-м, то вы автоматически знаете, что все запросы с тем же идентификатором сессии исходят от одного и того же человека (обратите внимание, что я не говорю * пользователь *), даже если он еще не прошел проверку подлинности, нет требуются проверки (если вы не хотите).Если вы можете только идентифицировать человека по его учетным данным пользователя, вам нужно проверить, соответствует ли пользователь + проход, прежде чем вы сможете понять, что это тот же парень. И, конечно же, анонимный браузер не может извлечь пользу из материалов, относящихся к сеансу. Я попытаюсь подробно остановиться на № 4. –

Смежные вопросы