Sécurité des applications PHP : top 10 des vulnérabilités pour débutants
PHP reste l'un des langages les plus populaires pour le développement web, mais sa flexibilité est souvent la cause de graves erreurs de sécurité. Pour un débutant, il est facile de passer à côté d'une vulnérabilité critique qui pourrait entraîner une fuite de données ou un piratage complet du serveur. Dans cet article, nous allons passer en revue les 10 vulnérabilités les plus courantes des applications PHP, montrer des exemples de code dangereux et vous apprendre à vous protéger correctement. Ce contenu est spécialement préparé pour les développeurs débutants qui souhaitent écrire du code sécurisé dès le premier jour.
1. Injections SQL (SQL Injection)
C'est la vulnérabilité la plus connue et la plus dangereuse. Elle se produit lorsque la saisie utilisateur est directement insérée dans une requête SQL sans échappement. Un attaquant peut accéder à la base de données, modifier ou supprimer des données.
Code dangereux :
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>Comment se protéger : Utilisez des requêtes préparées (prepared statements) avec PDO ou MySQLi.
<?php$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");$stmt->execute(['id' => $_GET['id']]);?>2. XSS (Scripting inter-sites)
Le XSS permet à un attaquant d'injecter du code JavaScript malveillant sur une page affichée à d'autres utilisateurs. Cela peut entraîner le vol de cookies de session ou une redirection vers des sites de phishing.
Code dangereux :
<?phpecho "Bonjour, " . $_GET['name'];?>Comment se protéger : Échappez toujours la sortie avec htmlspecialchars().
<?phpecho "Bonjour, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>3. CSRF (Falsification de requête inter-sites)
L'attaque CSRF force un utilisateur authentifié à effectuer une action non désirée sur le site (par exemple, changer son mot de passe ou transférer de l'argent). L'attaque se produit lorsque l'utilisateur clique sur un lien sur un site tiers.
Comment se protéger : Utilisez des jetons CSRF pour tous les formulaires et requêtes modifiant l'état.
<?phpsession_start();if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32));}?><form method="POST"> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> <button type="submit">Supprimer le compte</button></form>4. Gestion non sécurisée des fichiers
Permet à un attaquant de lire ou d'écrire des fichiers arbitraires sur le serveur. Par exemple, via un path traversal ou le téléchargement de shells PHP.
Code dangereux :
<?phpinclude($_GET['page'] . '.php');?>Comment se protéger : N'utilisez jamais la saisie utilisateur dans les chemins de fichiers. Utilisez des listes blanches de valeurs autorisées.
<?php$allowed_pages = ['home', 'about', 'contact'];$page = $_GET['page'] ?? 'home';if (in_array($page, $allowed_pages)) { include($page . '.php');} else { include('404.php');}?>5. Faiblesses d'authentification et de gestion des sessions
Mots de passe faibles, absence de protection contre le brute-force, fixation de session — tout cela ouvre la voie à la prise de contrôle des comptes.
Recommandations :
- Stockez les mots de passe uniquement sous forme hachée avec
password_hash(). - Utilisez HTTPS pour toutes les pages nécessitant une authentification.
- Régénérez l'ID de session après la connexion :
session_regenerate_id(true). - Définissez une durée de vie courte pour les sessions.
6. Référence directe non sécurisée à un objet (IDOR)
ID