Przejdź do treści

Centrum Kształcenia Zawodowego i Ustawicznego w Mrągowie

PHP: Skrypt logowania

środa,

PHP: Skrypt logowania

Obsługa mechanizmu logowania to często wymagana funkcja aplikacji internetowych. W przykładzie zademonstrowano proste rozwiązanie, które umożliwia logowanie użytkownika z regeneracją identyfikatora sesji i haszowaniem hasła. Skrypt jest uproszczony i służy celom edukacyjnym. W prawdziwych aplikacjach internetowych należy zwrócić uwagę na dodatkowe aspekty bezpieczeństwa. W prawdziwej aplikacji dane logowania powinny pochodzić z bazy danych. Bezpieczeństwo aplikacji internetowych jest złożonym tematem i wymaga ciągłej uwagi i aktualizacji praktyk zgodnie z najlepszymi standardami branżowymi.

Dla ułatwienia analizy kodu skrypt podzielono na trzy części (pliki).

Przykład skryptu logowania

Strona logowania (login.php)

<?php
  session_start();

  // Zakładamy, że dane użytkownika są przechowywane w bazie danych
  // Tutaj używamy stałych wartości dla celów demonstracyjnych
  $correctUsername = 'user1';
  $correctPasswordHash = password_hash('password123', PASSWORD_DEFAULT); // Hasło powinno być hashowane w bazie danych

  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
      $username = $_POST['username'] ?? '';
      $password = $_POST['password'] ?? '';

      if ($username === $correctUsername && password_verify($password, $correctPasswordHash)) {
          // Regeneracja ID sesji dla bezpieczeństwa
          session_regenerate_id();

          $_SESSION['loggedin'] = true;
          $_SESSION['username'] = $username;

          header("Location: welcome.php");
          exit;
      } else {
          echo "Niepoprawne dane logowania!";
      }
  }
?>
<form method="post">
    Username: <input type="text" name="username"><br>
    Password: <input type="password" name="password"><br>
    <input type="submit" value="Login">
</form>

Strona powitalna (welcome.php)

<?php
  session_start();

  if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
      header("Location: login.php");
      exit;
  }

  echo "Witaj, " . htmlspecialchars($_SESSION['username']) . "!";
  echo "<br><a href='logout.php'>Wyloguj się</a>";
?>

Wylogowanie (logout.php)

<?php
  <?php
  session_start();

  // Usuń wszystkie zmienne sesji
  $_SESSION = array();

  // Zniszcz sesję
  session_destroy();

  header("Location: login.php");
  exit;
?>

Ważne aspekty

  • Haszowanie hasła – hasła są hashowane przy użyciu password_hash i weryfikowane za pomocą password_verify. Nigdy nie przechowuj ani nie przesyłaj jawnych haseł, jak wspomniano, przykładowy skrypt nie spełnia tych wymagań z uwagi na uproszczenia mające ułatwić zasadę działania.
  • Regeneracja ID sesji – po pomyślnym logowaniu ID sesji jest regenerowane przez session_regenerate_id(). Jest to praktyka zapobiegająca atakom polegającym na przejęciu sesji.
  • Sprawdzanie statusu logowania – Na stronie welcome.php sprawdzamy, czy użytkownik jest zalogowany. Jeśli nie, przekierowujemy go do strony logowania.
  • Bezpieczeństwo – ten skrypt jest uproszczony i nie obejmuje wielu aspektów bezpieczeństwa, takich jak ochrona przed atakami CSRF, SQL Injection itp.
  • Przechowywanie danych użytkownika – w prawdziwych aplikacjach dane użytkownika powinny być przechowywane w bazie danych, a nie jako stałe wartości w kodzie. Dodatkowo hasło powinno być zapisane w postaci zahaszowanej.

Omówienie rozwiązania

Skrypt składa się z trzech głównych części: strony logowania (login.php), strony powitalnej (welcome.php) i skryptu wylogowania (logout.php). Każda z tych części odgrywa określoną rolę w procesie logowania.

Strona logowania (login.php)

Ten plik jest punktem wejścia dla użytkownika, który chce się zalogować. Skrypt obsługuje zarówno wyświetlanie formularza logowania, jak i przetwarzanie danych przesłanych przez użytkownika.

Sesja:

session_start();

Tunkcja session_start() inicjuje sesję lub wznawia istniejącą. Jest to niezbędne, aby móc używać globalnej zmiennej $_SESSION, która pozwala przechowywać informacje między różnymi stronami.

Przygotowanie danych do weryfikacji

$correctUsername = 'user1';
$correctPasswordHash = password_hash('password123', PASSWORD_DEFAULT);

Tutaj definiujemy przykładowe dane logowania. W prawdziwej aplikacji te dane powinny pochodzić z bazy danych. Hasło jest haszowane dla bezpieczeństwa.

Obsługa żądania POST

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    ...
}

Ten blok kodu wykonuje się, gdy użytkownik wysyła formularz (metodą POST). Sprawdzamy, czy żądanie do serwera zostało wykonane metodą POST.

Weryfikacja danych użytkownika:

$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';

if ($username === $correctUsername && password_verify($password, $correctPasswordHash)) {
    ...
}

Pobieramy przesłane dane (usernamepassword). Następnie sprawdzamy, czy nazwa użytkownika jest poprawna i czy hasło pasuje do zahaszowanego hasła.

Regeneracja ID sesji

session_regenerate_id();

Jest to środek bezpieczeństwa przeciwko atakom polegającym na przejęciu sesji. Tworzy nowe ID sesji, które jest używane po pomyślnym zalogowaniu.

Ustawienie zmiennych sesji i przekierowanie

$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;

header("Location: welcome.php");
exit;

Po pomyślnym zalogowaniu ustawiamy zmienne sesji i przekierowujemy użytkownika na stronę powitalną.

Formularz logowania

<form method="post">
    Username: <input type="text" name="username"><br>
    Password: <input type="password" name="password"><br>
    <input type="submit" value="Login">
</form>

Jest to prosty formularz HTML, który pozwala użytkownikowi wprowadzić swoją nazwę użytkownika i hasło.

Strona powitalna (welcome.php)

Ten plik wyświetla wiadomość powitalną po pomyślnym zalogowaniu się użytkownika.

Weryfikacja sesji

session_start();

if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
    header("Location: login.php");
    exit;
}

Ponownie rozpoczynamy sesję i sprawdzamy, czy użytkownik jest zalogowany. Jeśli nie, przekierowujemy go z powrotem do strony logowania.

Wyświetlanie wiadomości powitalnej i linku do wylogowania

echo "Witaj, " . htmlspecialchars($_SESSION['username']) . "!";
echo "<br><a href='logout.php'>Wyloguj się</a>";

Wyświetlamy powitanie dla użytkownika, używając jego nazwy z sesji. Używamy htmlspecialchars dla bezpieczeństwa, aby zapobiec atakom typu XSS. Udostępniono także link do wylogowania się.

3. Wylogowanie (logout.php)

Ten skrypt kończy sesję użytkownika, efektywnie wylogowując go.

Zakończenie sesji

session_start();
$_SESSION = array();
session_destroy();

Rozpoczynamy sesję, czyścimy zmienne sesji i niszczymy sesję.

Przekierowanie do strony logowania

header("Location: login.php");
exit;

Po zakończeniu sesji przekierowujemy użytkownika z powrotem do strony logowania.

Bezpieczeństwo

Chociaż ten skrypt zawiera podstawowe środki bezpieczeństwa, takie jak haszowanie haseł i regeneracja ID sesji, w prawdziwym środowisku produkcyjnym należy wziąć pod uwagę dodatkowe kwestie, takie jak ochrona przed atakami SQL Injection (przez użycie przygotowanych zapytań), ochrona przed atakami CSRF, walidacja i sanityzacja danych wejściowych oraz inne praktyki związane z bezpieczeństwem aplikacji internetowych.

Artykuł: Slackware

Slackware

Artykuł: Virtual Desktop Infrastructure

Virtual Desktop Infrastructure

Artykuł: Wirtualizacja: Overcommitment

Wirtualizacja: Overcommitment

Artykuł: Marc Andreessen

Marc Andreessen

Artykuł: Zakończenie staży

Zakończenie staży

Nasze technikum

Technik informatyk

Szkoły dla dorosłych

Nasza szkoła

Pełna oferta edukacyjna

Oferta szkoły