Смотрите у меня такой вопрос как лучше делать. При заходе на страницу проверять из Кук ун.индетификатор юзера по нему делать запрос и получать привелегии юзера в переменную, а потом проверять. Или при заходе привелегии получать из базы если нету в сессии ключа privilege, устанавливать его в сессию и там хранить кто он admin,user и т.д. чтобы на каждой странице не делать запрос в БД.
Ну сессия без кук не работает. Но id я бы держал в сессии. Хотя можно и в куках, в принципе, работал с таким движком, главное, пароль туда не кладите. Тут одно но - ID сессии уникальный для каждого устройства, с которого зашёл юзверь, а id узера - одинаковый. Так что менее гибко. Запрос всё равно делать каждый раз - запрос юзера по id очень дешёвый по времезатратам и нагрузке, сервер не рассыпется. Зато если захотите какое-нибудь закрытие сессии сразу всем устройствам сваять, или банить из админки уже войдённого пользователя, как раз пригодится.
дроб хеш пользователей отсутствовавших примерно 30 дней проверяем на существовании куки - если true проверяем значение куки с значением хеша с БД проверяем существовании сессии - если true пользуемся данными из сессии id, username и что там по желаниюесли false восстанавливаем сессию заполняя ее id, username и что там по желанию вытащив из бдесли false удаляем кукиесли false блин я забыл там походу с проверкой сущ сессии с ID опять идет + добавляем куки нее... бляяя--- Добавлено --- имбовую аутентификацию забыть логику, позор
@MouseZver а блин я не прав, зверь за то чтобы использовалась и сессия и куки, ты вообще реальный зверь в php.
Зачем держать хеш ? Хотя точно это у меня нету куков. А в куках скорее да нужно хранить уникальный хеш который если есть сверять с бд и восстонавливать по нему id сессии
нет --- Добавлено --- есть куки, есть сессия с флагом logged / нету хеша в бд ( мб очистился долго не заходил, или смена логина и т.д. ) восстановить хеш бд Аутентификация есть куки, есть хеш в бд / нету сессии ( закрыл браузер ) Аутентификация есть хеш в бд, есть сессия / нету кук ( браузер оффнул по сроку ) восстановить куки Аутентификация
@MouseZver лиж бы повыпендриваться а вот ниже не заметил что я дописал ? --- Добавлено --- бессмыслица использовать один и тот же хеш всегда. Его нужно генерировать уникальный каждый раз когда отдаёшь его в куку. И хранить пока время не истечёт повысит уровень защиты. --- Добавлено --- хотя при заходе с другово устр-ва будет выбивать. Предыдущее. --- Добавлено --- Но тут конечно можно что-нибудь придумать. Но эт ладно. Например держать массив хешей под разные устройства в json
дроб хеш пользователей отсутствовавших примерно 30 дней isCookie = проверяем куки true / false (1) isCookie = true isHash = проверяем значение куки с значением хеша с БД true / false isLogged = { проверяем существовании сессии logged true { isHash = true вытаскиваем из сессии данные. username ... return TRUE;ИНАЧЕ { проверяем существовании сессии logged true (2) запрос с бд id, username, password isHash = false { $hash = md5 ( $account -> id . $account -> username . $account -> password ); обновление онлайна / хеша по ID пользователя setcookie ( на 30 дней например );}ИНАЧЕ isHash = true запрос с бд id, usernameИНАЧЕ delCookie return false; isHash = true обновление онлайна по ID пользователязапись в сессию id logged = true username return true;}} isHash = true { проверяем существовании сессии logged true (2) запрос с бд id, username, password isHash = false { $hash = md5 ( $account -> id . $account -> username . $account -> password ); обновление онлайна / хеша по ID пользователя setcookie ( на 30 дней например );}ИНАЧЕ isHash = true запрос с бд id, usernameИНАЧЕ delCookie return false; isHash = true обновление онлайна по ID пользователя запись в сессию id logged = true username return true;} isCookie = true delCookiereturn FALSE;} Я eval эту логику составлять --- Добавлено --- я такой не умею же аргументировать --- Добавлено --- об этом думал и забил, в целях быстродействия -> меньше запросов аутентификации гуд --- Добавлено --- Спойлер: (1) PHP: protected function isCookie(): bool { return (bool) filter_input ( INPUT_COOKIE, $this -> cookie, FILTER_VALIDATE_REGEXP, [ 'options' => [ 'regexp' => '/^[a-f0-9]{32}$/' ] ] ); } без комментариев. Проверка нужна чтобы в дальнейшем заюзать обычный запрос к бд без подготовленных. Строго и просто. Нет = пошел нафуй куки = false Спойлер: (2) мм точно, помимо... бляя в первом ветвлении шло два раза проверки sess logged во втором только один хотя и нахрен мне дополнительный метод с флагом прописывать чтобы проверить несчастную переменную, пусть остается isset ( $_SESSION['logged'] ) --- Добавлено --- https://github.com/MouseZver/My-garbage-code/tree/master/php.ru/64708/66365 --- Добавлено --- хотя стоп, это обычно относится к хешу паролю, а хеш аутентификации составляется стандартом из id name password = можно через password_verify /hash создать токен, вобщем надо думать, а думать лень перед выходными --- Добавлено --- а толк если verify скажет true при разных полярностей времени, ой впизду
PHP: // примерный код error_reporting(-1); session_start(); function message($key, $value) { $_SESSION[$key] = $value; session_regenerate_id(); header('location: ' . $_SERVER['REQUEST_URI']); exit(); } if (filter_has_var(INPUT_POST, 'do')) { if ($_POST['do'] != session_id()) { message('red', 'Идентификатор не соответствует'); } # код обработчика message('green', 'Идентификатор соответствует'); } if ($_SESSION) { foreach ($_SESSION as $key => $value) { echo '<div style="color: ' . $key . ';">' . $value . '</div>'; } } ?> <form method="post"> <button name="do" value="<?= session_id() ?>"> Отправить </button> </form>
Это типа CSRF-защита? Обычно всё-таки другое значение делают, не session_id(). И он меняется в течение одной сессии после разных отправок форм часто
Да. --- Добавлено --- Ппц у вас тут баталии, хотя автору нужно было просто узнать, первый вариант или второй предпочтительней. При том, что он явно понимает, что делает, либо собирается делать, но ищет совет со стороны для выбора направления. --- Добавлено --- По части первого варианта - он банально сложнее в сопровождении и использовании. Да и незачем user_id хранить в куке. А если я другой поставлю? Тут гляди, какая логика - все данные, которые не нужны клиенту, которые не влияют на его работу, которые не участвуют в его логике, не должны храниться на клиенте. Все, что приходит от клиента - априори хакерская атака. Мысли именно такими категориями. Вытаскивая на клиент лишние серверные данные ты добавляешь векторы атак, только и всего. И усложняешь логику приложения на ровном месте. Сессии были придуманы не просто так. Use it!