Sécurité des applications PHP : top 10 des vulnérabilités pour débutants
\nPHP reste l'un des langages les plus populaires pour le développement web, mais sa flexibilité se transforme souvent en vulnérabilités si les règles de sécurité de base ne sont pas respectées. Selon l'OWASP, la plupart des piratages proviennent de 10 erreurs typiques commises par les développeurs débutants. Dans cet article, nous analyserons chaque vulnérabilité avec des exemples de code réels et montrerons comment protéger votre application.
\n\n1. Injections SQL (SQL Injection)
\nL'attaque la plus courante. L'attaquant injecte du code SQL malveillant via une saisie utilisateur.
\nCode vulnérable :
\n<?php\n$id = $_GET['id'];\n$query = "SELECT * FROM users WHERE id = $id";\n$result = mysqli_query($conn, $query);\n?>\nProtection : Utilisez des requêtes préparées (prepared statements) :
\n<?php\n$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");\n$stmt->bind_param("i", $_GET['id']);\n$stmt->execute();\n$result = $stmt->get_result();\n?>\n\n2. XSS (Cross-Site Scripting)
\nInjection de code JavaScript dans une page via des données non vérifiées.
\nCode vulnérable :
\n<?php\necho "Bonjour, " . $_GET['name'];\n?>\nProtection : Échappez la sortie avec htmlspecialchars() :
<?php\necho "Bonjour, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');\n?>\n\n3. CSRF (Cross-Site Request Forgery)
\nAttaque où l'utilisateur effectue des actions indésirables en son nom.
\nCode vulnérable :
\n<form action="/delete.php" method="POST">\n <input type="submit" value="Supprimer le compte">\n</form>\nProtection : Ajoutez un jeton CSRF :
\n<?php\nsession_start();\n$_SESSION['csrf_token'] = bin2hex(random_bytes(32));\n?>\n<form action="/delete.php" method="POST">\n <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">\n <input type="submit" value="Supprimer le compte">\n</form>\n\n4. Stockage non sécurisé des mots de passe
\nStockage des mots de passe en clair ou avec des hachages obsolètes (MD5, SHA1).
\nCode vulnérable :
\n<?php\n$password = md5($_POST['password']);\n// ou\n$password = sha1($_POST['password']);\n?>\nProtection : Utilisez password_hash() et password_verify() :
<?php\n$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);\n// Vérification :\nif (password_verify($input_password, $hash)) {\n echo "Mot de passe correct";\n}\n?>\n\n5. Gestion non sécurisée des fichiers (Inclusion de fichiers locale/distant)
\nInclusion de fichiers via une saisie utilisateur sans vérification.
\nCode vulnérable :
\n<?php\ninclude($_GET['page'] . '.php');\n?>\nProtection : Utilisez une liste blanche de fichiers autorisés :
\n<?php\n$allowed_pages = ['home', 'about', 'contact'];\n$page = $_GET['page'] ?? 'home';\nif (in_array($page, $allowed_pages)) {\n include($page . '.php');\n} else {\n include('404.php');\n}\n?>\n\n6. Configuration incorrecte des sessions
\nUtilisation d'identifiants de session prévisibles ou absence de régénération.
\nCode vulnérable :
\n<?php\nsession_start();\n$_SESSION['user_id'] = $user_id;\n// La session n'est pas régénérée après la connexion\n?>\nProtection :
\n<?php\nsession_start();\nsession_regenerate_id(true); // Régénération de l'ID après la connexion\n$_SESSION['user_id'] = $user_id;\n?>\n\n7. Validation insuffisante des entrées
\nConfiance en toutes les données provenant de l'utilisateur.
\nU