Авторизация, варианты реализации

sanu0074

Новичок
Как правильно реализовать авторизацию на сайте, при условии что браузер должен запоминать юзера.
Есть вариант такой:

Отправляем логин и пароль, пароль хэшируем функцией password_hash().
При авторизации сравниваются строки хэша.

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

Это самый простой способ который только можно придумать. Хочется что-то более усложненное, например так чтобы меньше оставлять "палева" в куках или так чтобы при каждом обновлении страницы не сверялось совпадении пароля и ID по куке, а например можно рассмотреть вариант если сессия с ключом для этого юзера запущена - то не делать запросы к бд для сравнивания id и пароля. Посоветуйте что нибудь пожалуйста!
 

rdbn

Новичок
Посмотри как реализовано в фремворках. Например в Symfony2, Yii, Kohana, laravel
 

AmdY

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

Vladson

Сильнобухер
Для начала нужно просто посмотреть ТЗ, там должно быть указано. Если пишешь для себя то перед тем как писать составь ТЗ, где подробно опиши "зачем нужна авторизация" и "какие вопросы она решает". В зависимости от цели реализаций можно миллиард придумать, и каждая в своём случае будет правильной. Универсального ответа нет.
 

riff

Новичок
Ставь в куку обычный хэш "логин-пароль-соль", а если у тебя всё жутко секретно, то записывай в базу дату последнего коннекта, и через полчаса бездействия не пускай без ввода логин-пароля.
 

hell0w0rd

Продвинутый новичок
riff, а зачем это так делать?
У нас же сессия - тоже моделька, почему бы в ней не хранить время первого логина?
 

hell0w0rd

Продвинутый новичок
riff, от того, что сессию не используешь как хранилище - она не перестает быть сессией. На мой взгляд.
Ставь в куку обычный хэш "логин-пароль-соль"
Это и есть сессия
 
  • Like
Реакции: WMix

hell0w0rd

Продвинутый новичок
WMix, не обязательно. Как минимум можно сделать куку ограниченной по времени. Но доверять куке не стоит - так что, в сессии пишем время, когда ее нужно прибить и каждый запрос проверяем.
 

WMix

герр M:)ller
Партнер клуба
каким образом на значение hash повлияет ограничение по времени если оно равно
хэш( "логин-пароль-соль" ),
подождем пока пользователь перелогинится, и опять все работает?
 

WMix

герр M:)ller
Партнер клуба
ну вот если бы да кабы. но и в timestamp есть уязвимость, это число всегда больше чем известное, причем на сколько, тоже заранее известно, где-то эта инфа передается, иначе не знаю как ты угадаешь, что это тот пользователь, кем он себя именует. но угадать значительней сложнее, согласен, главное, что мы это понимаем :)
 

hell0w0rd

Продвинутый новичок
WMix, вместо timestamp может быть любая динамическая информация... uniqid, например:)
Но свою ошибку я понял, нельзя не добавлять что-то динамическое в значение куки
 

doran7

Новичок
Хорошо реализована система авторизации и авто-авторизации (при установленной галочке "Запомнить меня") в форуме на открытом коде FluxBB. Например.
Кука флакса при авторизации (аутентификации) пользователя проверяется в файле login.php и при успешной авторизации переустанавливается в браузере пользователя.
Кука флакса при авто-авторизации проверяется через файлы index.php, включающем common.php, включающем functions.php (строка 42 в common.php) вызовом функцией check_cookie() (строка 154 в common.php), и при успешной авто-авторизации переустанавливается функцией pun_setcookie() (в файле functions.php).
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
doran7, какая вообще ценность твоего сообщения? Зачем расписывать какую-то авторизацию в вакууме? Строки могут поменяться, имена методов тоже.
 

Absinthe

жожо
Хорошо реализована система авторизации и авто-авторизации (при установленной галочке "Запомнить меня") в форуме на открытом коде FluxBB. Например
Такой код не должен быть опенсорсным. При его чтении ощущаешь себя как-то так:
 

MiksIr

miksir@home:~$
Кука со временем жизни
hash( пароль . секрет . время ) . время
На сервере проверяем время и считаем хеш как защита от подмены

riff, от того, что сессию не используешь как хранилище - она не перестает быть сессией. На мой взгляд.
Это и есть сессия
Все же в 99% когда человек на форуме php говорит "сессия" - он имеет ввиду механизм php. Во избежании путаницы лучше не путаться.
Это самый простой способ который только можно придумать. Хочется что-то более усложненное, например так чтобы меньше оставлять "палева" в куках или так чтобы при каждом обновлении страницы не сверялось совпадении пароля и ID по куке, а например можно рассмотреть вариант если сессия с ключом для этого юзера запущена - то не делать запросы к бд для сравнивания id и пароля. Посоветуйте что нибудь пожалуйста!
В БД все-равно рекомендуется глянуть на предмет - не удален ли этот пользователь уже. Да и вообще использование механизма сессии как механизма кеширования ("что бы в базу не лазить") не совсем верно. Если не нравится "палево", просто генерируете уникальную строку, ставьте ее в куку и пишите в базу соответствие "строка - user_id".
 
Сверху