Leçon 11 / 15

Gérer une session et protéger les pages

30 min PHP 8 — structurer une application (PDO, POO, sessions) Gratuit

Objectif : Créer une session de connexion et refuser l’accès aux pages privées sans authentification.

Une page privée ne doit pas se contenter de masquer ses liens : elle doit vérifier l’identité de la personne avant de transmettre des données ou d’effectuer une action. Sans contrôle côté serveur, une URL saisie directement dans le navigateur peut contourner l’interface. Dans cette leçon, vous ajoutez un état de connexion en session et un contrôle au point d’entrée du carnet.

Une session permet de conserver des données entre plusieurs requêtes d’un même navigateur. PHP associe ces données à un identifiant transmis au navigateur dans un cookie ; le contenu de la session reste stocké côté serveur. Vous avez déjà créé le service qui vérifie un mot de passe avec password_verify() : la session ne remplace pas cette vérification, elle mémorise son résultat pour les requêtes suivantes.

Démarrer la session avant toute réponse

Appelez session_start() au début du point d’entrée, avant d’envoyer du HTML, un espace ou une réponse HTTP. PHP doit pouvoir envoyer ou lire l’en-tête du cookie de session ; si une sortie a déjà commencé, l’initialisation peut échouer. Le réglage du cookie ci-dessous impose une transmission uniquement par HTTP, interdit son accès depuis JavaScript et limite son usage aux requêtes du site.

public/index.php — contrôle de sessionPHP
<?php

declare(strict_types=1);

session_set_cookie_params([
    'httponly' => true,
    'secure' => isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off',
    'samesite' => 'Lax',
]);

if (!session_start()) {
    http_response_code(500);
    exit;
}

$action = $_POST['action'] ?? $_GET['action'] ?? '';

if ($action === 'deconnexion' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    $_SESSION = [];

    if (ini_get('session.use_cookies')) {
        $parametres = session_get_cookie_params();
        setcookie(session_name(), '', [
            'expires' => time() - 42000,
            'path' => $parametres['path'],
            'domain' => $parametres['domain'],
            'secure' => $parametres['secure'],
            'httponly' => $parametres['httponly'],
            'samesite' => $parametres['samesite'],
        ]);
    }

    session_destroy();
    header('Location: /', true, 303);
    exit;
}

$authentifie = ($_SESSION['authentifie'] ?? false) === true;

if (!$authentifie) {
    http_response_code(401);
    header('Content-Type: text/plain; charset=UTF-8');
    exit('Accès réservé. Connectez-vous pour continuer.');
}

http_response_code(200);
header('Content-Type: text/plain; charset=UTF-8');
exit('Session authentifiée : accès privé autorisé.');
Résultat attendu
Une requête sans session authentifiée reçoit le statut HTTP 401 et le message « Accès réservé. Connectez-vous pour continuer. ». Une requête authentifiée reçoit le statut 200. Une requête POST avec action=deconnexion détruit la session et redirige vers / avec le statut 303.

Le contrôle compare la valeur de session à true de manière stricte. Ainsi, une chaîne telle que "true" ou un champ absent ne suffit pas à ouvrir l’accès. Dans le code de cette étape, aucune connexion n’est encore créée : le formulaire et le contrôleur de connexion ajouteront l’écriture de cette valeur après une vérification réussie. Ce point d’entrée est néanmoins exécutable et refuse par défaut tout accès privé.

Marquer l’authentification et renouveler l’identifiant

Après que le service d’authentification a validé le mot de passe, l’application doit renouveler l’identifiant de session, puis enregistrer l’état authentifié. Le renouvellement limite le risque de fixation de session : un identifiant utilisé avant la connexion ne doit pas rester celui de la session privilégiée. Ce raccordement sera placé dans le traitement de la connexion, et non dans une classe métier ni dans le gabarit.

À exécuter après la vérification réussie du mot de passePHP
if (!session_regenerate_id(true)) {
    throw new RuntimeException('Impossible de renouveler la session.');
}

$_SESSION['authentifie'] = true;

Déconnecter proprement

La déconnexion ne consiste pas à mettre l’indicateur à faux. Le code vide les données côté serveur, expire le cookie du navigateur avec les paramètres de celui qui a été créé, puis détruit la session. La redirection utilise le code 303 afin que le navigateur revienne à la page d’accueil avec une requête GET après l’envoi du formulaire POST.

Le formulaire de déconnexion prévu par le squelette envoie justement une requête POST portant l’action deconnexion. Le point d’entrée peut donc traiter cette action avant le contrôle d’accès : une personne déjà connectée peut fermer sa session, tandis qu’une personne anonyme ne peut pas atteindre le contenu privé. Dans la prochaine leçon, le contrôleur de connexion reliera le formulaire, le service de vérification et l’écriture de l’état en session.

À retenir

  • Démarrez la session dans le point d’entrée, avant toute sortie HTTP.
  • Après une vérification réussie, renouvelez l’identifiant et stockez uniquement l’état authentifié nécessaire.
  • Vérifiez cet état côté serveur avant de servir toute page ou action privée ; refusez par défaut.
  • À la déconnexion, videz les données, expirez le cookie et détruisez la session.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.