Sécurité des applications PHP : top 10 des vulnérabilités et méthodes de protection
PHP reste l'un des langages les plus populaires pour le développement web, mais sa flexibilité se traduit souvent par des vulnérabilités. Selon les rapports de sécurité, plus de 70 % des applications web présentent au moins une vulnérabilité critique. Dans cet article, nous allons analyser le top 10 des vulnérabilités PHP les plus dangereuses, fournir des exemples de code réels et montrer comment protéger efficacement votre application.
1. Injections SQL (SQL Injection)
La vulnérabilité la plus courante et la plus dangereuse. Un attaquant peut injecter du code SQL arbitraire via une saisie utilisateur.
Code vulnérable :
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>Protection : utilisation des requêtes préparées (Prepared Statements) :
<?php$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param("i", $_GET['id']);$stmt->execute();$result = $stmt->get_result();?>2. XSS (Cross-Site Scripting)
Injection de scripts malveillants dans les pages web. Il en existe trois types : reflété, stocké et DOM-based.
Code vulnérable :
<?phpecho "Bonjour, " . $_GET['name'];?>Protection : échappement de la sortie :
<?phpecho "Bonjour, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>3. CSRF (Cross-Site Request Forgery)
Attaque où un attaquant force un utilisateur à effectuer des actions indésirables sur un site où il est authentifié.
Protection : utilisation des jetons CSRF :
<?phpsession_start();if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32));}
// Vérification lors de l'envoi du formulaireif ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('Attaque CSRF détectée !');}?>
<form method="POST"> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> <button type="submit">Envoyer</button></form>4. Path Traversal (Dépassement de chemin)
Vulnérabilité permettant de lire des fichiers arbitraires sur le serveur.
Code vulnérable :
<?php$file = $_GET['file'];include("pages/" . $file);?>Protection : validation et restriction des chemins :
<?php$allowed_files = ['about.php', 'contact.php', 'home.php'];$file = basename($_GET['file']);
if (in_array($file, $allowed_files)) { include("pages/" . $file);} else { die('Accès refusé');}?>5. Upload de fichiers (File Upload)
Un téléchargement de fichiers non sécurisé peut entraîner l'exécution de code arbitraire sur le serveur.
Protection : vérification du type MIME et de l'extension :
<?php$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];$max_size = 5 * 1024 * 1024; // 5 MB
if ($_FILES['file']['size'] > $max_size) { die('Fichier trop volumineux');}
$finfo = finfo_open(FILEINFO_MIME_TYPE);$mime_type = finfo_file($finfo, $_FILES['file']['tmp_name']);
if (!in_array($mime_type, $allowed_types)) { die('Type de fichier non autorisé');}
// Renommer le fichier pour la sécurité$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);$new_name = md5(uniqid()) . '.' . $extension;move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $new_name);?>6. Session Fixation (Fixation de session)
Attaque où un attaquant impose à l'utilisateur un identifiant de session connu.
Protection : régénération de l'ID de session :
<?phpsession_start();
// Après une authentification réussieif