Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
22 / 15 / 3
Регистрация: 05.11.2013
Сообщений: 425

Авторизация по cookie с проверкой срока годности из БД

17.11.2021, 15:02. Показов 548. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Вообщем есть скрипт который загружается на каждой странице и проверяется куки, если куки есть и они активны (срок годности не прошел - эта дата записывается в БД, чтобы не смогли подделать дату куки) то установить переменную $auth = "1"; а дальше на каждой странице сайта где это нужно, проверять если $auth = "1"; тогда вывести информацию как для авторизованного


Вот скрипт авторизации:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
if (isset($_POST['login']))
    $login = mb_strtolower($_POST['login']);
if (isset($_POST['password']))
    $password = $_POST['password'];
 
$last_login_ip = mysqli_real_escape_string($db_connection, ip2long(getRealIpAddr())) ;
$last_login_user_agent = mysqli_real_escape_string($db_connection, $_SERVER['HTTP_USER_AGENT']) ;
 
$fail = validate_login($login);
if ($fail == "")
{
    $login = mysqli_real_escape_string($db_connection, $login) ;
    $query = "SELECT login  FROM users WHERE  login='$login'";
    $result = mysqli_query($db_connection, $query) or die(mysqli_error($db_connection));
    $row_count = mysqli_num_rows($result);
    if ($row_count < 1)
    {
        $fail = "Неверный логин или пароль. <br />";
    }
}
if ($fail == "")
{
    $query = "SELECT id, login, hash FROM users WHERE  login='$login' LIMIT 1";
    $result = mysqli_query($db_connection, $query) or die(mysqli_error($db_connection));
    $row = mysqli_fetch_assoc($result);
    //     var_dump($row);
    $hash_current = $row ['hash'];
    if (password_verify($password, $hash_current))
    {
 
        $key_cookie = generateSalt();
        $cookie = md5($login . $key_cookie);
 
        $query = "UPDATE users
        SET last_login_datetime=CURRENT_TIMESTAMP(), last_login_user_agent='$last_login_user_agent', cookie='$cookie'
WHERE login = '$login'";
        $result = mysqli_query($db_connection, $query) or die(mysqli_error($db_connection));
 
        $_SESSION['login'] = $login;
        $_SESSION['logged'] = "1";
        $log_ok = "1";
 
        setcookie ("login", $login, time() + 120 ); // ставлю куки на 2 минуты пока для теста
        setcookie ("cookie", $cookie, time() + 120 ); // ставлю куки на 2 минуты пока для теста
 
        $log_ok_text = "$login, Авторизация прошла успешно. Вернуться на <a href='$site_url/index.php' >Главную</a>
 
 " ;
 
    }
    else
    {
        $fail = "Неверный логин или пароль. <br />";
 
        $text_to_log = "$login введен неверный пароль";
    }
}
 
    if(isset($_POST['log']))
    {
        $fail2 = "<tr><td colspan='2'>В вашей форме найдены следующие ошибки:<br> <p><font color=red size='1'><i> $fail
</i></font></p></td></tr>
";
 
    }
    else
    {
        $fail2 = "";
    }
 
    require 'header.php';
// дальше идет html код


А вот скрипт проверки куки\авторизации, подгружается на каждой странице где нужно проверить авторизован или нет:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
//$auth = "0"; // авторизован 1, нет 0
 
if (isset($_COOKIE['login']) AND isset($_COOKIE['cookie']))
 
{
    $session_login = $_COOKIE['login'];
    $session_cookie = $_COOKIE['cookie'];
 
    $query = " SELECT id, login, cookie, last_login_datetime FROM users WHERE login='$session_login' LIMIT 1";
    $result = mysqli_query($db_connection, $query) or die(mysqli_error($db_connection));
    $row = mysqli_fetch_array($result);
    if (mysqli_num_rows($result) > 0)
    {
        if (
            $row['cookie'] === $session_cookie AND (   ( ($row['last_login_datetime'])+120 ) > CURRENT_TIMESTAMP()  )
        )
        {
            $login = $row['login'];
            $key_cookie = generateSalt();
            $cookie = md5($login . $key_cookie);
            $query = "UPDATE users
        SET last_login_datetime=CURRENT_TIMESTAMP(), cookie='$cookie'
WHERE login = '$login'";
 
            $query = " SELECT id, login, cookie FROM users WHERE login='$session_login' LIMIT 1";
            $result = mysqli_query($db_connection, $query) or die(mysqli_error($db_connection));
            $row = mysqli_fetch_array($result);
            setcookie ("login", $row['login'], time() + 120 );// продлеваю куки на 2 минуты пока для теста
            setcookie ("cookie", $row['cookie'], time() + 120 );// продлеваю куки на 2 минуты пока для теста
            $auth = "1";
        }
        else
        {
            header('Location: '. $site_url . "/index.php?s=logout");
 
        }
    }
 
 
}
else
{
    $auth = "0";
}
 
 
?>
Каждый раз при авторизации и при открытии любой странице,
last_login_datetime обновляется в базе в формате 2021-11-17 10:58:46
в поле cookie записывается хэш который сравнивается с хэшем из БД.

Что хочу сделать: Каждый раз при открытии любой странице скрипт авторизации проверяет, есть ли у данного login куки, смотрит куки в базе и плюс проверяет срок установки последний раз куки по полю last_login_datetime. Например для теста установить хочу 2 минуты срок годности куки.
Вот в таком виде не работает сравнение, как правильно сравнивать срок установки куки, если например мне надо сделать срок жизни 2 минуты (для теста)
PHP
1
2
3
if (
            $row['cookie'] === $session_cookie AND (   ( ($row['last_login_datetime'])+120 ) > CURRENT_TIMESTAMP()  )
        )
После чего на каждой странице сайта где необходимо, буду проверять переменную $auth 0 она или 1, и выводить соответствующую разную инфу в зависимости от того авторизован ли пользователь. Если срок годности прошел, то отправить пользователя на страницу /index.php?s=logout для обнуления куки и необходимости авторизоваться еще раз.
Как правильно сделать проверку срока годности куки сравнивая из БД?

Добавлено через 5 часов 51 минуту
Изменил скрипт проверки авторизации

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
 
//$auth = "0"; // авторизован 1, нет 0
 
if (isset($_COOKIE['login']) and isset($_COOKIE['cookie']))
{
    $session_login = fix_security($_COOKIE['login']);
    $session_cookie = fix_security($_COOKIE['cookie']);
 
    $query = " SELECT id, login, cookie, last_login_datetime FROM users WHERE login='$session_login' LIMIT 1";
    $result = mysqli_query($db_connection, $query) or die(mysqli_error($db_connection));
    $row = mysqli_fetch_array($result);
    if (mysqli_num_rows($result) > 0)
    {
        $last_login_datetime = $row['last_login_datetime'];
        $last_login_datetime = strtotime('$last_login_datetime + 2 minutes');
        $current_datetime = strtotime(date('Y-m-d H-i-s', time()));
        if (
          $row['cookie'] = $session_cookie and ($last_login_datetime  > $current_datetime )
        )
        {
            $login = $row['login'];
            $key_cookie = generateSalt();
            $cookie = md5($login . $key_cookie);
            $query = "UPDATE users
        SET last_login_datetime=CURRENT_TIMESTAMP(), cookie='$cookie'
WHERE login = '$login'";
 
            $query = " SELECT id, login, cookie FROM users WHERE login='$session_login' LIMIT 1";
            $result = mysqli_query($db_connection, $query) or die(mysqli_error($db_connection));
            $row = mysqli_fetch_array($result);
            setcookie("login", $row['login'], time() + 120);
            setcookie("cookie", $row['cookie'], time() + 120);
            $auth = "1";
        } else
        {
            header('Location: ' . $site_url . "/index.php?s=logout");
 
        }
    }
 
 
} else
{
    $auth = "0";
}
Все равно не хочет запускаться, после ввода логина и пароля уходит в циклический редирект, как правильно сравнить дата со временем?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.11.2021, 15:02
Ответы с готовыми решениями:

Указание срока годности
У меня диплом &quot;Сеть розничной торговли&quot; в 1С. Продуктовый. Срок годности указывать в Справочнике &quot;Номенклатура&quot; или создать...

Вычисление срока годности
Здравствуйте, Коллеги! Программирую в делфи. БД в Access. Есть поле с датой выпуска, поле со сроком годности в месяцах (лекарство и...

Поле с окончанием срока годности
Ребят! В БД, в одной из таблиц есть поле со сроком годности товара и поле дата изготовления товара. А как сделать еще одно поле, в котором...

1
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
19.11.2021, 19:30
Я-бы сделал вместо времени записи куки, время протухания. Можно вторым полем. Писал бы сразу, до какого она валидна.
https://www.w3schools.com/sql/... te_add.asp

Далее я-бы не делал проверку на PHP, а еще на уровне mysql запроса отсек бы невалиданые данные
PHP
1
$query = "SELECT id, login, cookie FROM users WHERE login='{$session_login}' where valid_till_date > now() LIMIT 1";
Вот и все, и пхп логика упростится. Либ есть данные в базе валидныем, либо нет

Добавлено через 17 минут

Не по теме:

and valid_till - опечатка

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.11.2021, 19:30
Помогаю со студенческими работами здесь

Риски по истечению срока годности
Друзья! Давно мучаюсь с расчетом даты истечения сроков годности. Речь идет о формуле, в которой будет отображаться дата просрочки с учетом...

Истечение срока годности (Работа с датами)
Тяжело объяснить чего хочу, но постараюсь. В общем у меня в бд есть поле Data и поле SrokG (Дата изготовления и Срок годности...

Вычисление конечной даты срока годности
Здравствуйте! помогите пож-та, необходимо составить формулу, по которой можно рассчитать конечный срок годности продуктов по следующим...

Добавить поле с окончанием срока годности
Ребят! В БД, в одной из таблиц есть поле со сроком годности товара и поле дата изготовления товара. А как добавить еще одно поле, в котором...

Выбор срока годности по номенклатуре в расходной накладной
Решаю задачку по БУ. В ТЗ написано, что в ТЧ Документа надо проставлять срок годности товара. Для Приходной и Расходной накладной. Для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru