Les cookies
Support de cours :
CookiesLien PDF du cours
🍪 Les cookies en PHP
1. Pourquoi utiliser les cookies ?
Un cookie est un petit fichier texte stocké sur l’ordinateur de l’utilisateur par son navigateur. Contrairement aux sessions qui sont côté serveur, les cookies sont côté client. Ils permettent de conserver des informations persistantes même après la fermeture du navigateur.
Exemples : mémoriser la langue choisie, retenir un panier d’achat, sauvegarder un identifiant pour la connexion automatique.
2. Caractéristiques
- Un cookie contient un nom et une valeur.
- Il peut avoir une date d’expiration (sinon il s’efface à la fermeture du navigateur).
- Il est envoyé par le serveur au navigateur, puis renvoyé automatiquement au serveur à chaque requête sur le même domaine.
- Sa taille est limitée (environ 4 Ko par cookie).
3. Créer un cookie en PHP
On utilise la fonction setcookie()
avant d’envoyer du contenu HTML :
<?php
// Créer un cookie valable 1 heure
setcookie("prenom", "Jean", time() + 3600);
?>
⚠️ Comme pour les sessions, setcookie()
doit être appelé avant tout affichage HTML (en-têtes HTTP).
4. Lire un cookie
<?php
if (isset($_COOKIE['prenom'])) {
echo "Bonjour " . htmlspecialchars($_COOKIE['prenom']);
} else {
echo "Aucun cookie 'prenom' trouvé.";
}
?>
5. Supprimer un cookie
Pour supprimer un cookie, on le recrée avec une date d’expiration passée :
<?php
setcookie("prenom", "", time() - 3600); // expire dans le passé
?>
6. Différences cookies vs sessions
Cookies | Sessions |
---|---|
Données stockées chez le client | Données stockées sur le serveur |
Persiste après fermeture du navigateur (si expiration définie) | Se termine généralement quand on ferme le navigateur ou détruit la session |
Limité en taille (environ 4 Ko) | Pas de limite pratique (c’est côté serveur) |
Moins sécurisé (modifiable côté client) | Plus sécurisé (données gardées côté serveur) |
7. Exemple concret : retenir la langue choisie
<?php
// Si l'utilisateur choisit une langue
if (isset($_GET['langue'])) {
setcookie('langue', $_GET['langue'], time() + 30*24*3600); // 30 jours
$_COOKIE['langue'] = $_GET['langue']; // mise à jour immédiate
}
// Utiliser la langue
$langue = isset($_COOKIE['langue']) ? $_COOKIE['langue'] : 'fr';
echo "Langue actuelle : " . htmlspecialchars($langue);
?>
<a href="?langue=fr">Français</a> | <a href="?langue=en">English</a>
8. Bonnes pratiques
- Éviter de stocker des informations sensibles (mots de passe, numéros de carte bancaire).
- Définir une date d’expiration adaptée et utiliser l’option
httponly
si possible pour limiter l’accès JavaScript. - Préférer les sessions pour les informations critiques (authentification, autorisations).
- Informer les utilisateurs de l’utilisation de cookies (obligation légale RGPD).
Vidéo :
TAF :
- Intégrer le date et l’heure de la dernière visite en bas de page sur le site PhotoForYou (Pompier)
Session
🌐 Les sessions en PHP
1. Pourquoi utiliser une session ?
HTTP est un protocole sans mémoire : à chaque nouvelle page, le serveur oublie qui est l’utilisateur. Une session permet de stocker des informations sur l’utilisateur côté serveur, et d’y accéder sur toutes les pages du site tant que la session est ouverte.
Exemple : garder un utilisateur connecté après qu’il se soit identifié, mémoriser son panier d’achats, etc.
2. Comment ça fonctionne ?
- Quand on démarre une session (
session_start()
), le serveur crée un identifiant unique (ID de session). - Cet identifiant est stocké chez l’utilisateur sous forme d’un cookie (souvent nommé
PHPSESSID
). - Les données sont conservées sur le serveur dans la variable globale
$_SESSION
.
3. Utilisation basique
Démarrer une session
⚠️ Toujours appeler session_start()
avant tout code HTML envoyé au navigateur.
<?php
session_start(); // Doit être au tout début du fichier
// Stocker une information dans la session
$_SESSION['nom'] = "Dupont";
$_SESSION['role'] = "admin";
echo "Bonjour " . $_SESSION['nom'];
?>
Lire une valeur de session
<?php
session_start();
if (isset($_SESSION['nom'])) {
echo "Bienvenue " . $_SESSION['nom'];
} else {
echo "Vous n'êtes pas connecté.";
}
?>
Supprimer une valeur ou fermer la session
<?php
session_start();
// Supprimer une variable spécifique
unset($_SESSION['nom']);
// Détruire complètement la session
session_destroy();
?>
4. Bonnes pratiques
- Toujours appeler
session_start()
avant d’accéder à$_SESSION
. - Protéger les pages réservées :
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit;
}
?>
- Ne pas stocker de données sensibles (mot de passe, carte bancaire) en clair.
- Prévoir une déconnexion après un temps d’inactivité (timeout).
Vidéo :
Complément de cours :
- Pour clôturer une session on utilise donc session_destroy()
- On peut aussi définir une durée comme pour les cookies avec init_set()
ini_set(‘session.gc_maxlifetime’, 60 * 60 * 24); - Si vous voulez connaitre le délai courant c’est ini_get()
ini_get(‘session.gc_maxlifetime’)
TAF :
- Ajouter un formulaire pour s’identifier (Login / Mot de passe ) a votre application PhotoForYou. Au début on ne fera pas avec la base de données et le login est Mylène et le mot de passe Micoton. On se contentera de vérifier directement en PHP.
- Si c’est bon création de session et la personne peut accéder à toutes les pages sinon une page lui indique de s’identifier.
- Faire cela maintenant avec la BDD en hachant le mot de passe. On gardera le login Mylène et le mot de passe Micoton mais ils seront stockées en BDD.
Comment faire en POO
Quand on programme en PHP orienté objet, il est préférable d’encapsuler la gestion des sessions et des cookies dans des classes dédiées, plutôt que d’utiliser directement $_SESSION
ou $_COOKIE
partout. Cela rend le code plus clair, réutilisable et maintenable.
1. Classe pour gérer les sessions
<?php
class SessionManager
{
public function __construct()
{
if (session_status() === PHP_SESSION_NONE) {
session_start(); // démarre la session si pas déjà fait
}
}
public function set(string $key, mixed $value): void
{
$_SESSION[$key] = $value;
}
public function get(string $key, mixed $default = null): mixed
{
return $_SESSION[$key] ?? $default;
}
public function has(string $key): bool
{
return isset($_SESSION[$key]);
}
public function remove(string $key): void
{
unset($_SESSION[$key]);
}
public function destroy(): void
{
$_SESSION = [];
session_destroy();
}
}
// --- Utilisation ---
$session = new SessionManager();
$session->set('user_id', 42);
echo $session->get('user_id'); // 42
?>
Avantages : toute la logique de session est centralisée, facile à faire évoluer (ex. changer le stockage des sessions).
2. Classe pour gérer les cookies
<?php
class CookieManager
{
public function set(
string $name,
string $value,
int $expire = 3600,
string $path = "/",
bool $secure = false,
bool $httpOnly = true
): void {
setcookie($name, $value, [
'expires' => time() + $expire,
'path' => $path,
'secure' => $secure,
'httponly' => $httpOnly,
'samesite' => 'Lax'
]);
$_COOKIE[$name] = $value; // lecture immédiate possible
}
public function get(string $name, mixed $default = null): mixed
{
return $_COOKIE[$name] ?? $default;
}
public function has(string $name): bool
{
return isset($_COOKIE[$name]);
}
public function delete(string $name): void
{
setcookie($name, "", time() - 3600, "/");
unset($_COOKIE[$name]);
}
}
// --- Utilisation ---
$cookies = new CookieManager();
$cookies->set('theme', 'dark', 86400); // cookie valable 1 jour
echo $cookies->get('theme'); // dark
$cookies->delete('theme');
?>
Avantages : meilleure sécurité (paramètres httponly
, secure
), code plus propre que d’appeler setcookie()
partout.
Ce contenu est réservé aux membres du site. Si vous êtes un utilisateur existant, veuillez vous connecter. Les nouveaux utilisateurs peuvent s'inscrire ci-dessous.