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Γ©)