Top 10 des vulnérabilités des applications PHP : comment protéger votre code
PHP reste l'un des langages les plus populaires pour le développement web. Cependant, sa flexibilité et sa simplicité conduisent souvent à l'apparition de vulnérabilités critiques. Selon les statistiques de l'OWASP, plus de 70 % des applications web présentent au moins une faille de sécurité grave. Dans cet article, nous allons analyser les 10 vulnérabilités les plus courantes des applications PHP, montrer des exemples de code dangereux et donner des recommandations pratiques pour la protection.
1. Injections SQL (SQL Injection)
L'attaque la plus connue et la plus dangereuse. L'attaquant injecte du code SQL via une saisie utilisateur.
Code dangereux :
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>Code sécurisé (utilisation de requêtes préparées) :
<?php$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param("i", $_GET['id']);$stmt->execute();$result = $stmt->get_result();?>Recommandations :
- Utilisez toujours des expressions préparées (PDO ou MySQLi).
- Ne concaténez jamais les données utilisateur dans les requêtes SQL.
- Validez les types de données (par exemple,
is_numeric()pour les ID).
2. XSS (Cross-Site Scripting)
Injection de code JavaScript dans une page via des données non vérifiées. Vol de cookies, redirection vers des sites de phishing.
Code dangereux :
<?phpecho "Bonjour, " . $_GET['name'];?>Code sécurisé :
<?phpecho "Bonjour, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>Recommandations :
- Échappez la sortie avec
htmlspecialchars(). - Définissez Content-Security-Policy (CSP) dans les en-têtes.
- Pour les réponses JSON, utilisez
json_encode().
3. CSRF (Cross-Site Request Forgery)
L'attaquant force un utilisateur authentifié à effectuer une action non désirée (par exemple, un transfert d'argent).
Exemple de formulaire sans protection :
<form action="delete.php" method="POST"> <input type="hidden" name="id" value="123"> <input type="submit" value="Supprimer"></form>Code sécurisé (avec token) :
<?phpsession_start();if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32));}?><form action="delete.php" method="POST"> <input type="hidden" name="token" value="<?= $_SESSION['token'] ?>"> <input type="hidden" name="id" value="123"> <input type="submit" value="Supprimer"></form>Recommandations :
- Générez des tokens CSRF uniques pour chaque formulaire.
- Vérifiez les tokens côté serveur avant d'exécuter les actions.
- Utilisez SameSite Cookie (Lax ou Strict).
4. Authentification et gestion de sessions incorrectes
Protection de session faible, fuite d'identifiants, fixation de session.
Code vulnérable :
<?phpsession_start();if ($_POST['password'] == 'admin123') { $_SESSION['logged'] = true;}?>Code sécurisé :
<?phpsession_start();session_regenerate_id(true); // Changement de l'ID de session après connexion
// Hachage du mot de passe$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);if (password_verify($input_password, $hash)) { $_SESSION['logged'] = true; $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];}?>Recommandations :
- Utilisez
password_hash()etpas