MODULE 05
Fichiers, Sessions & Cookies
Persistance des donnΓ©es cΓ΄tΓ© serveur : fichiers, sessions PHP et cookies sΓ©curisΓ©s.
1 Fichiers
<?php
// ββ Lecture ββββββββββββββββββββββββββββββββββββββββββββ
$contenu = file_get_contents('data.txt'); // lecture complète
$lignes = file('data.txt', FILE_IGNORE_NEW_LINES); // tableau de lignes
// Lecture ligne par ligne (grands fichiers)
$handle = fopen('gros_fichier.csv', 'r');
while (($ligne = fgets($handle)) !== false) {
echo htmlspecialchars(trim($ligne)) . "\n";
}
fclose($handle);
// ββ Γcriture βββββββββββββββββββββββββββββββββββββββββββ
file_put_contents('log.txt', "Accès " . date('Y-m-d H:i:s') . "\n", FILE_APPEND | LOCK_EX);
// FILE_APPEND : ajouter en fin | LOCK_EX : verrou exclusif (thread-safe)
// Γcriture avec fwrite
$handle = fopen('output.txt', 'w'); // 'w' : Γ©crase, 'a' : append
fwrite($handle, "Ligne 1\n");
fwrite($handle, "Ligne 2\n");
fclose($handle);
// ββ Informations βββββββββββββββββββββββββββββββββββββββ
echo file_exists('data.txt') ? 'existe' : 'absent';
echo is_file('data.txt'); // vrai si fichier (pas dossier)
echo is_readable('data.txt'); // vrai si lisible
echo filesize('data.txt'); // taille en octets
// ββ Suppression ββββββββββββββββββββββββββββββββββββββββ
unlink('tmp.txt'); // supprimer un fichier
2 Sessions
Une session PHP conserve des donnΓ©es entre les requΓͺtes via un identifiant de session stockΓ© dans un cookie ou l'URL.
<?php
session_start(); // DOIT Γͺtre appelΓ©e avant tout envoi HTML
// Stocker des donnΓ©es en session
$_SESSION['user_id'] = 42;
$_SESSION['username'] = 'Alice';
$_SESSION['roles'] = ['admin', 'editor'];
// Lire
echo $_SESSION['username']; // Alice
// VΓ©rifier
if (isset($_SESSION['user_id'])) {
echo "ConnectΓ© en tant que " . htmlspecialchars($_SESSION['username']);
}
// Supprimer une variable
unset($_SESSION['username']);
// ββ DΓ©connexion complΓ¨te ββββββββββββββββββββββββββββββββ
session_start();
$_SESSION = []; // vider toutes les variables
// Supprimer le cookie de session
if (ini_get("session.use_cookies")) {
$p = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000, $p['path'], $p['domain'], $p['secure'], $p['httponly']);
}
session_destroy(); // supprimer le fichier session cΓ΄tΓ© serveur
// ββ AprΓ¨s connexion : rΓ©gΓ©nΓ©rer l'ID ββββββββββββββββββ
// PrΓ©vient le session fixation attack
session_regenerate_id(true); // true = supprimer l'ancien ID
3 Cookies
<?php
// setcookie() DOIT Γͺtre appelΓ© avant tout envoi HTML (comme header())
// Cookie simple (expire Γ la fermeture du navigateur si expires=0)
setcookie('theme', 'dark', 0, '/');
// Cookie avec options de sΓ©curitΓ© (PHP 7.3+ β tableau d'options)
setcookie('session_token', $token, [
'expires' => time() + 86400 * 30, // 30 jours
'path' => '/',
'domain' => '',
'secure' => true, // HTTPS uniquement
'httponly' => true, // inaccessible en JavaScript
'samesite' => 'Strict', // Strict | Lax | None
]);
// Lire un cookie
$theme = $_COOKIE['theme'] ?? 'light'; // ?? si cookie absent
// Supprimer un cookie : dΓ©finir une date d'expiration passΓ©e
setcookie('theme', '', time() - 3600, '/');
β οΈ httponly: true empΓͺche le JavaScript d'accΓ©der au cookie β protection essentielle contre le vol de session via XSS. secure: true n'envoie le cookie que via HTTPS.
4 SΓ©curitΓ© des sessions
<?php
// ββ Session Fixation βββββββββββββββββββββββββββββββββ
// Attaque : l'attaquant force un ID de session connu avant la connexion
// Prévention : régénérer l'ID après chaque changement de privilège
session_start();
if (login($email, $password)) {
session_regenerate_id(true); // OBLIGATOIRE après connexion
$_SESSION['user_id'] = getUserId($email);
}
// ββ Session Hijacking βββββββββββββββββββββββββββββββββ
// Attaque : vol du cookie de session (rΓ©seau non sΓ©curisΓ©, XSS)
// PrΓ©vention 1 : cookie httponly + secure
// PrΓ©vention 2 : lier la session Γ l'empreinte du navigateur
session_start();
if (isset($_SESSION['user_id'])) {
$fingerprint = hash('sha256', $_SERVER['HTTP_USER_AGENT'] . '|' . $_SERVER['REMOTE_ADDR']);
if ($_SESSION['fingerprint'] !== $fingerprint) {
session_destroy(); // session compromise β forcer reconnexion
header('Location: /login.php');
exit;
}
}
// ββ Configurer PHP.ini pour les sessions βββββββββββββ
// session.cookie_httponly = 1
// session.cookie_secure = 1
// session.use_strict_mode = 1 (rejette les IDs non initialisΓ©s)
// session.gc_maxlifetime = 1800 (30 min d'inactivitΓ©)