Я использую простую систему входа, основанную на VES СЕССИИ. После входа пользователя в систему установлен параметр var var, который сообщает моему скрипту, что пользователь должен быть принят. Я не использую какой-либо пользовательский cookie cookie clientide.
Я хотел бы предложить вариант на экране входа в систему, в котором говорится: «Держите меня в лотерею за весь день». Как сделать это безопасным способом?
Сначала: session.cookie_lifetime
директиву session.cookie_lifetime
либо в php.ini, либо в файлах конфигурации, либо через session_set_cookie_params()
.
Затем сохраните имя пользователя и хэш-значение пароля в сеансе и подтвердите, что логин на каждой странице. Пока они все еще действительны, они могут войти в систему.
Естественное истечение сеанса cookie должно, как правило, содержать вещи в порядке, так как вы не сможете выходить из системы в середине своей сессии (если, конечно, звезды выровнены для него), если они будут поддерживать его. В противном случае я считаю, что решение eCartoth займет второе место, поскольку вы можете просто добавить вторую строку в оператор if:
if (my_validate_user_function($_SESSION['username'],$_SESSION['passhash']) && $_SESSION['deathstamp'] > time() ) { // user is logged in again, oh boy! } else { // send in the death robots header('Location: /login.php',true,302); }
EDIT: Одна вещь, которую вы, возможно, захотите рассмотреть, – это фиксация сеанса и / или захват сеанса. Чтобы это предотвратить, я бы рекомендовал один (или оба) из двух решений:
session_regenerate_id()
после каждой успешной попытки входа в систему. Когда вы говорите «держите меня зарегистрированным в течение всего дня», я предполагаю, что вы имеете в виду только эту конкретную машину, правильно? Вы можете использовать таблицу mysql для запоминания «времени входа в систему» или отметки времени, когда этот логин больше не будет действительным, если они захотят войти в систему весь день. Затем добавьте скрипт в начало вашего кода, который извлекает идентификатор этого пользователя из сеансовых варов. Сравните текущую временную метку этого пользователя с сохраненными «последними действительными ts», и если это прошло, вы знаете, что они должны быть выведены из системы, после чего вы протрите сеанс и заставите пользователя снова войти в систему. Этот метод означает, что они фактически не будут выходить из системы, пока они не попытаются сделать что-то в прошлом, но им это будет похоже. Кроме того, вместо использования mysql DB вы также можете сохранить этот последний действительный TS в переменной сеанса.
Так, например, когда пользователь сначала регистрируется в «сохранить меня во всех выбранных днях»:
$_SESSION['log_me_out_at'] = strtotime(date("Ymd ")."23:59:59");
Затем каждый раз, когда страница доступна в вашей системе:
if( $_SESSION['log_me_out_at'] < time() ){ unset($_SESSION['user_is_accepted_in']); }
сif( $_SESSION['log_me_out_at'] < time() ){ unset($_SESSION['user_is_accepted_in']); }
Одним из вариантов может быть настройка таблицы MySQL, которая сохраняет переменные сеанса и связывает их с IP-адресами и истечением срока действия, но я не уверен в деталях о том, как это будет реализовано.
Самый простой (хотя и не рекомендуемый) способ сделать то, что вы ищете, – это установить $_COOKIE
с именем пользователя и паролем на компьютере, который ваш сайт будет проверять, когда пользователь подписывается.
Для дополнительной безопасности вам будет лучше сохранить только один файл cookie в виде соленого MD5-хэша данных пользователя, чтобы предоставить потенциальному хакеру меньше информации о данных учетной записи пользователя. Продолжительность может быть установлена при настройке файла cookie; php.net имеет достаточно полную документацию о том, как это сделать.