Autorisation et authentification en PHP : des bases à la sécurité
La sécurité des applications web commence par une implémentation correcte de l'authentification (vérification de l'identité de l'utilisateur) et de l'autorisation (vérification de ses droits d'accès). En PHP, ces mécanismes peuvent être implémentés à l'aide de fonctions intégrées ou de bibliothèques spécialisées. Dans cet article, nous aborderons les concepts clés, écrirons des exemples de code et examinerons les meilleures pratiques de sécurité.
1. Concepts de base : authentification vs autorisation
Avant d'écrire du code, il est important de bien distinguer les deux termes :
- Authentification — processus de vérification que l'utilisateur est bien celui qu'il prétend être (généralement via un identifiant et un mot de passe).
- Autorisation — processus de détermination des ressources ou actions accessibles à un utilisateur authentifié (par exemple, le rôle "admin" ou "user").
Des erreurs dans l'implémentation de l'une ou l'autre de ces étapes peuvent entraîner une fuite de données ou un accès non autorisé.
2. Authentification de base via les sessions (PHP natif)
La méthode la plus courante est l'utilisation des sessions. PHP fournit un mécanisme intégré $_SESSION. Examinons un exemple simple.
Étape 1 : Formulaire de connexion (login.php)
<?phpsession_start();?><!DOCTYPE html><html><head> <title>Connexion au site</title></head><body> <form method="POST" action="login.php"> <label>Identifiant :</label> <input type="text" name="username" required> <label>Mot de passe :</label> <input type="password" name="password" required> <button type="submit" name="login">Se connecter</button> </form></body></html>Étape 2 : Traitement de la connexion (même login.php)
<?phpsession_start();require_once 'db.php'; // connexion à la base de données
if (isset($_POST['login'])) { $username = trim($_POST['username']); $password = $_POST['password'];
// 1. Requête préparée pour se protéger des injections SQL $stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch();
// 2. Vérification du mot de passe via password_verify if ($user && password_verify($password, $user['password_hash'])) { // Authentification réussie $_SESSION['user_id'] = $user['id']; $_SESSION['logged_in'] = true; header("Location: dashboard.php"); exit; } else { $error = "Identifiant ou mot de passe incorrect"; }}?>Étape 3 : Vérification de l'autorisation sur une page protégée
<?phpsession_start();if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { header("Location: login.php"); exit;}// Accès autoriséecho "Bienvenue, utilisateur #" . htmlspecialchars($_SESSION['user_id']);?>3. Hachage des mots de passe : ne stockez jamais les mots de passe en clair
PHP fournit des fonctions sécurisées pour travailler avec les mots de passe :
password_hash($password, PASSWORD_BCRYPT)— crée un hachage avec un sel automatiquement.password_verify($password, $hash)— vérifie le mot de passe par rapport au hachage.
Exemple d'inscription d'un utilisateur :
<?php$password = "user123";$hash = password_hash($password, PASSWORD_BCRYPT);// Enregistrer $hash dans la base de données$stmt = $pdo->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)");$stmt->execute([$username, $hash]);?>Important : n'utilisez jamais md5() ou sha1() pour les mots de passe — ils sont obsolètes et facilement cassables.
4. Autorisation basée sur les rôles (Role-Based Access Control)
Pour la gestion des droits