nmk

Лабораторна робота №9 (2 години)

Тема: Сторінка логіну (Сесії). Створення простого екрану входу з використанням “захардкоженого” логіну/пароля та запис статусу в $_SESSION.

Мета: Зрозуміти проблему зберігання стану (stateless) в протоколі HTTP та навчитись ідентифікувати користувача між перезавантаженням різних сторінок на основі Cookie і Сесій.

Технологічний стек: PHP Sessions (session_start(), $_SESSION), імітація аутентифікації.

Завдання

  1. Створити нову сторінку з формою логіну (login.php).
  2. “Захардкодити” (прописати статично в коді) ідеальні логін і пароль (наприклад, admin та 12345).
  3. Використати session_start() для відкриття сесії та збереження факту успішного входу користувача через $_SESSION['is_logged_in'] = true.
  4. Обмежити доступ до сторінки “Створення завдання” (create.php), щоб на неї не могли зайти гості (анонімні відвідувачі).

Хід виконання роботи

Крок 1. Сторінка входу (login.php)

Створіть файл login.php з HTML-формою входу. Вона має містити два поля: <input type="text" name="username"> та <input type="password" name="password">, кнопку “Увійти” і відправлятися методом POST сама на себе.

Крок 2. Авторизація користувача

Угорі файлу login.php, обов’язково В САМОМУ ПОЧАТКУ (навіть до пробілів чи тегу <!DOCTYPE html>), викличте команду session_start();. Обробляйте POST-запит: якщо отримані $_POST['username'] і $_POST['password'] ідеально збігаються з умовними ‘admin’ та ‘12345’, запишіть позитивний стан у сесію та перенаправте користувача:

<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if ($_POST['username'] === 'admin' && $_POST['password'] === '12345') {
        $_SESSION['is_logged_in'] = true;
        $_SESSION['user_name'] = 'Адміністратор';
        header('Location: index.php'); // Перенаправлення на головну
        exit;
    } else {
        $error = "Невірний логін або пароль!";
    }
}
?>

Крок 3. Відображення профілю або логіну

Перейдіть у файл index.php. Також додайте в самому першому рядку session_start();. У <header> напишіть if: якщо isset($_SESSION['is_logged_in']) && $_SESSION['is_logged_in'] === true, то виведіть привітання: “Привіт, <?= $_SESSION['user_name'] ?>! [Вийти]”. Інакше — “Ви увійшли як Гість. [Увійти]” (де [Увійти] — це посилання <a href="login.php">).

Крок 4. Обмеження доступу до приватного контенту (Protecting Routes)

Відкрийте файл create.php. На початку файлу викличте session_start(); і відразу ж перевірте, чи залогінений користувач:

<?php
session_start();
if (!isset($_SESSION['is_logged_in']) || $_SESSION['is_logged_in'] !== true) {
    header('Location: login.php');
    exit;
}
?>

Тепер, якщо неавторизований користувач захоче руками ввести адресу http://localhost/.../create.php у браузері, його миттєво “викине” назад на форму логіну. Спробуйте це перевірити в режимі “Інкогніто”.

Контрольні запитання

  1. HTTP — це “stateless” протокол (без стану). Що це означає для розробника і чому сервер не впізнає одного й того ж користувача на різних сторінках без додаткових інструментів?
  2. Яка різниця між Cookie та Сесією ($_SESSION)? Де фізично зберігаються дані змінних сесії (на клієнті в браузері чи на сервері)?
  3. Що таке PHPSESSID і яку функцію виконує цей файл cookie?
  4. Для чого необхідно викликати session_start() на самому-самому початку файлу, навіть до тегу <html> чи пробілів? Яку помилку ви отримаєте, якщо викличете це після HTML-коду (Headers already sent)?
  5. Що виконує функція header('Location: ...') і чому після перенаправлення обов’язково треба писати exit (або die)?

Вимоги до звіту

  1. У lab9.md додати фрагмент коду авторизації (login.php) і перенаправлення (обмеження доступу з create.php).
  2. Додати 2 скриншоти: один з меню браузера “Гість”, інший (після успішного логіну) з написом “Привіт, Адміністратор!”.
  3. Зафіксувати код на GitHub і додати посилання.
  4. У файлі lab9.md відповісти на контрольні запитання.