Sécurité des applications PHP : top 10 des vulnérabilités en pratique

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

Sécurité des applications PHP : top 10 des vulnérabilités en pratique

PHP reste l'un des langages les plus populaires pour le développement web, mais sa flexibilité se traduit souvent par de sérieux problèmes de sécurité. Selon l'OWASP, 80 % des attaques contre les applications web sont liées à des vulnérabilités qui peuvent être évitées dès la phase d'écriture du code. Dans cet article, nous allons analyser les 10 vulnérabilités les plus courantes des applications PHP avec des exemples de code réels et des méthodes de protection. Ce contenu sera utile aussi bien aux développeurs débutants qu'aux développeurs expérimentés.



1. Injections SQL (SQL Injection)

La vulnérabilité la plus dangereuse et la plus répandue. L'attaquant injecte du code SQL via des champs de saisie, obtenant ainsi un accès à la base de données.

Code vulnérable :

$username = $_POST['username'];$query = "SELECT * FROM users WHERE username = '$username'";

Attaque : La saisie de ' OR '1'='1 transforme la requête en SELECT * FROM users WHERE username = '' OR '1'='1', renvoyant tous les utilisateurs.

Protection : Utilisez des requêtes préparées (prepared statements) avec PDO :

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");$stmt->execute(['username' => $_POST['username']]);


2. XSS (Cross-Site Scripting)

L'attaquant injecte du code JavaScript qui s'exécute dans le navigateur de la victime. Il en existe trois types : reflété, stocké et DOM-based.

Code vulnérable (XSS stocké) :

echo "<div>" . $comment . "</div>";

Protection : Échappez la sortie avec htmlspecialchars() :

echo "<div>" . htmlspecialchars($comment, ENT_QUOTES, 'UTF-8') . "</div>";

Pour le contenu HTML, utilisez des bibliothèques comme HTML Purifier.



3. CSRF (Cross-Site Request Forgery)

L'attaque force un utilisateur authentifié à effectuer une action non désirée sur le site, comme changer son mot de passe ou transférer des fonds.

Protection : Implémentez des jetons CSRF :

// Génération du jeton$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

// Dans le formulaireecho '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';

// Vérificationif ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('Attaque CSRF détectée');}


4. Path Traversal (Parcours de répertoires)

L'attaquant manipule les chemins d'accès aux fichiers pour accéder aux fichiers système (/etc/passwd, etc.).

Code vulnérable :

$file = $_GET['file'];include("pages/" . $file);

Protection : Utilisez des listes blanches ou la fonction basename() :

$allowed = ['home', 'about', 'contact'];$file = basename($_GET['file']);if (in_array($file, $allowed)) {    include("pages/$file.php");} else {    die('Fichier non autorisé');}


5. Vulnérabilités de téléchargement de fichiers (File Upload Vulnerabilities)

L'attaquant télécharge un script PHP au lieu d'une image, obtenant un accès distant au serveur.

Protection :

  • Vérifiez le type MIME du fichier : $_FILES['file']['type']
  • Utilisez finfo pour déterminer le type réel
  • Interdisez l'exécution de scripts dans le dossier de téléchargement via .htaccess
  • Générez des noms de fichiers uniques : md5(uniqid()) . '.jpg'
$finfo = finfo_open(FILEINFO_MIME_TYPE);$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);$allowed = ['image/jpeg', 'image/png'];if (!in_array($mime, $allowed)) {    die('Type de fichier non autorisé');}


6. Fixation de session (Session Fixation)

L'attaquant impose à l'utilisateur un identifiant de session connu afin de l'intercepter après l'authentification.

Protection : Après une authentification réussie

Blogs

Book Recommendations