Sécurité des applications PHP : top 10 des vulnérabilités et protection

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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() et pas

Blogs

Book Recommendations