Вы описываете дизайн, в котором учетные данные пользователя проверяются на каждом запросе страницы, а форма входа используется только для хранения этих учетных данных в браузере. Я вижу несколько проблем с таким необычным подходом:
- Вы передаете конфиденциальную информацию на каждый запрос HTTP.
- Чтобы проверить учетные данные, которые вы, возможно, должны выполнить запрос к базе данных, и вы делаете это снова и снова и снова.
- Вы должны проверить учетные данные, чтобы узнать, от кого запрос.
- Одновременные соединения с одинаковыми учетными данными будут обмениваться данными [см. Добавление].
Более типично проверять пользователя один раз (возможно, используя зашифрованный канал или хешированную информацию) и запомнить его в течение указанного времени.
Независимо от того, что сеансы и файлы cookie - это совершенно разные инструменты. Файлы cookie - это клиентское хранилище, а сеансы - серверные. Они связаны только друг с другом, поскольку в самой типичной реализации сеанса используются файлы cookie для хранения идентификатора сеанса (поскольку HTTP - это протокол без учета состояния, вам нужны такие трюки, чтобы отслеживать, какой запрос пришел от кого). Преимуществом серверного хранилища является то, что вы полностью контролируете его:
- Вы можете использовать как можно больше места.
- Вы можете использовать любой формат данных, который вам нужен.
- Вы можете хранить конфиденциальные данные или вещи, которые вы не хотите видеть пользователю или калечить.
- Вы можете доверять этой информации с вы,.
Добавление
В классической системе сессии, где вы назначаете произвольный идентификатор на сессии начать зарегистрированный пользователь может иметь множество одновременных экземпляров сеанса в разных компьютерах (или даже в одном компьютере, например, один в Firefox и еще три в окнах режима инкогнито Chrome). Если вы только отождествляете посетителя с его именем пользователя, у пользователя будет только один сеанс: если он отправится домой на обед, он найдет сеанс, который он оставил на работе, если он поделится своим паролем с другом, он увидит, что его друг делает. Это можно считать ошибкой или признаком, и, конечно, есть много уловок, чтобы предотвратить это. Просто учтите это.
идентификаторы сеансов, чтобы избежать повторного использования имени пользователя и пароля пользователя после успешной аутентификации объекта (успешный вход в систему), вместо того, чтобы повторно запрашивать у пользователя свое имя пользователя и пароль для каждого запроса, который он отправил на ваш сервис, вы просто нужно проверить связанный с ним session_id. (да, вы также можете добиться того же, используя его имя пользователя и пароль). в этом случае последний подход имеет более серьезные риски для безопасности. – ultrajohn
Вы правы в том, что риск разоблачения пароля в файле cookie, учитывая очень сильный хеш, может быть довольно низким. Но зачем беспокоиться? Просто используйте случайно сгенерированный идентификатор сеанса, и никогда не будет шансов, что пароль может быть «unhashed». Кроме того, вы должны повторно использовать существующую систему аутентификации, когда это возможно, потому что, действительно, она сложна. Например, взгляните на https://github.com/delight-im/PHP-Auth, который является как агрегированным, так и агрегированным по базе данных. – caw