Как сделать, чтобы PHP-сайт узнавал пользователя: cookie, session и логин

Короткий ответ: PHP-сайт узнает пользователя через cookie и сессии. Браузер хранит небольшой идентификатор, сервер по этому идентификатору понимает, какой пользователь открыл страницу. Для обычного входа на сайт чаще всего используют session_start() и сохраняют в сессии user_id

Важно: сайт не “узнает человека” сам по себе. Он узнает браузер, в котором есть нужная cookie. Если пользователь открыл другой браузер, очистил cookie или зашел с другого устройства, сайт не сможет связать его с прежней сессией без нового входа

Самый простой пример сессии

login.php

<?php

session_start();

$_SESSION['user_id'] = 15;
$_SESSION['user_name'] = 'Динар';

header('Location: profile.php');
exit;

profile.php

<?php

session_start();

if (!isset($_SESSION['user_id'])) {
    echo 'Вы не вошли';
    exit;
}

echo 'Здравствуйте, ' . htmlspecialchars($_SESSION['user_name'], ENT_QUOTES, 'UTF-8');

После входа сервер сохраняет данные сессии, а браузер хранит cookie с идентификатором сессии. При следующем запросе PHP восстанавливает $_SESSION

Как сделать выход

logout.php

<?php

session_start();

$_SESSION = [];
session_destroy();

header('Location: login-form.php');
exit;

Так пользователь выходит из текущей сессии. В рабочем проекте можно дополнительно удалить cookie сессии, но для первого понимания достаточно увидеть принцип

Cookie хранится в браузере. Сессия хранится на сервере, а в браузере обычно лежит только идентификатор сессии

Плохой вариант

setcookie('is_admin', '1');

Если сайт доверяет такой cookie, пользователь может попытаться изменить ее значение. Поэтому права доступа и user_id лучше проверять на сервере

Лучше хранить в сессии только идентификатор пользователя, а роль и права брать из базы

Что такое remember me

“Запомнить меня” — это отдельная логика поверх обычной сессии. Обычно сайт выдает долгоживущий токен в cookie, а в базе хранит его безопасную версию. При следующем визите сайт проверяет токен и создает новую сессию

Не храните пароль в cookie. Не храните роль администратора в cookie. Не храните user_id как единственное доказательство входа без защиты

Как связать с базой данных

После проверки логина и пароля вы находите пользователя в базе, проверяете пароль через password_verify(), затем сохраняете user_id в сессии

<?php

session_start();

if (password_verify($passwordFromForm, $user['password_hash'])) {
    $_SESSION['user_id'] = $user['id'];
    header('Location: profile.php');
    exit;
}

echo 'Неверный логин или пароль';

Пароль в базе должен храниться не как обычный текст, а как хеш через password_hash()

Проверка доступа к странице

На закрытых страницах делайте проверку в начале файла

<?php

session_start();

if (!isset($_SESSION['user_id'])) {
    header('Location: login-form.php');
    exit;
}

Лучше вынести такую проверку в отдельный файл и подключать его на всех закрытых страницах

Мини-практика

Создайте три файла: login.php, profile.php, logout.php. В login.php запишите тестовый user_id в сессию, в profile.php покажите имя пользователя, в logout.php уничтожьте сессию

Потом откройте profile.php до входа, после входа и после выхода. Так вы увидите, как сайт “узнает” пользователя по сессии

Частые ошибки

Забывают вызвать session_start() до работы с $_SESSION

Выводят HTML до session_start() и header(), а потом получают ошибки заголовков

Хранят пароль или роль администратора в cookie

Считают cookie абсолютным доказательством личности. Cookie можно потерять, украсть или подделать, если система сделана плохо

Не делают выход из аккаунта

Не проверяют доступ на каждой закрытой странице

Не используют password_hash() и password_verify() для паролей

Что почитать дальше по PHP

Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x