Un site web exposé sur Internet est en permanence scanné par des robots à la recherche de failles. La bonne nouvelle, c’est que la plupart des attaques sont connues, prévisibles, et donc évitables si l’on applique des règles simples côté serveur, PHP et base de données.
Voici les 10 attaques web les plus courantes et surtout comment s’en protéger, avec des exemples et des bonnes pratiques.
1 Injection SQL (SQLi)
L’attaquant injecte du SQL dans un champ (formulaire, URL) pour lire, modifier ou supprimer des données (comptes, commandes, emails…).
- Utiliser des requêtes préparées (PDO / MySQLi) et ne jamais concaténer l’input dans le SQL
- Valider/caster les types (int, enum, listes blanches)
- Donner au compte MySQL le minimum de droits (pas de GRANT/FILE/…)
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute(['email' => $email]);
2 Cross-Site Scripting (XSS)
Du JavaScript malveillant est injecté dans une page (via commentaire, profil, paramètre d’URL) pour voler des cookies ou exécuter des actions à la place de l’utilisateur.
- Échapper toutes les sorties HTML (escape output)
- Nettoyer/filtrer les entrées (HTML autorisé via liste blanche)
- Ajouter une Content-Security-Policy (CSP) si possible
echo htmlspecialchars($comment, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
3 CSRF (Cross-Site Request Forgery)
Une page externe force un utilisateur connecté à envoyer une requête (changer email, mot de passe, virement…) sans s’en rendre compte.
- Ajouter un token CSRF unique dans les formulaires
- Vérifier le token côté serveur avant toute action sensible
- Utiliser des cookies de session SameSite (Lax/Strict)
// Génération
$_SESSION['csrf'] = bin2hex(random_bytes(32));
// Vérification
if (!hash_equals($_SESSION['csrf'], $_POST['csrf'] ?? '')) exit('CSRF');
4 Brute force / credential stuffing
Des bots testent des milliers de mots de passe ou des identifiants volés (email+mdp) pour prendre le contrôle des comptes.
- Limiter le nombre d’essais (rate limiting) + temporisation
- Ajouter un captcha après X tentatives
- Activer la double authentification (2FA) pour les comptes à privilèges
5 Upload de fichiers malveillants
L’attaquant envoie un fichier (image, PDF, “.php” déguisé) pour exécuter du code ou déposer une backdoor.
- Vérifier extension + MIME + contenu (pas seulement le nom)
- Renommer les fichiers et les stocker hors webroot si possible
- Désactiver l’exécution PHP dans le dossier d’upload
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($_FILES['file']['tmp_name']);
$allowed = ['image/jpeg','image/png','application/pdf'];
if (!in_array($mime, $allowed, true)) exit('Fichier non autorisé');
6 Inclusion de fichiers (LFI/RFI)
Une variable d’URL est utilisée dans un include/require et permet de charger un fichier local (LFI) ou distant (RFI) pour exécuter du code ou lire des secrets.
- Ne jamais inclure un fichier à partir d’une donnée utilisateur
- Utiliser une liste blanche de routes/pages
- Désactiver
allow_url_include(et vérifier la config PHP)
$pages = ['home' => 'home.php', 'contact' => 'contact.php'];
$key = $_GET['p'] ?? 'home';
include $pages[$key] ?? $pages['home'];
7 Session hijacking (vol de session)
L’attaquant récupère ou devine un identifiant de session (via XSS, réseau compromis, cookie mal protégé) et se connecte à la place de l’utilisateur.
- Cookies de session en HttpOnly + Secure + SameSite
- Regénérer l’ID de session après login
- Forcer HTTPS partout
session_set_cookie_params([
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
session_regenerate_id(true);
8 Mauvaise configuration serveur (exposition)
Indexation de répertoires, fichiers sensibles accessibles, version PHP affichée, erreurs trop bavardes… souvent, l’attaque commence par une fuite d’info.
- Désactiver le listing de dossier, protéger
.env,backup.zip,phpinfo() - Configurer des pages d’erreur propres (ne pas afficher de stack trace en prod)
- Mettre à jour Apache/PHP et limiter les modules
9 Exploitation de plugins / dépendances vulnérables
Sur WordPress, ou sur un projet PHP, une dépendance non mise à jour suffit parfois à compromettre tout le site.
- Mettre à jour CMS, plugins, thèmes et bibliothèques
- Supprimer ce qui n’est pas utilisé
- Sur PHP, surveiller les vulnérabilités (Composer + advisories)
10 DDoS / abus de ressources
Le serveur est saturé par un volume de requêtes (DDoS) ou par des actions coûteuses (recherche non optimisée, endpoints non limités).
- Mettre en place du rate limiting (par IP / endpoint)
- Utiliser un CDN / WAF si nécessaire
- Optimiser les endpoints lourds (cache, index DB, pagination)
Checklist rapide
- Tout passer en HTTPS + cookies Secure/HttpOnly/SameSite
- Requêtes SQL préparées partout (aucune concaténation)
- Escape systématique en sortie HTML (anti-XSS)
- Token CSRF sur formulaires sensibles
- Rate limiting sur login + endpoints exposés
- Uploads vérifiés + stockage hors webroot
- Mises à jour CMS/plugins/dépendances régulières
- Logs activés + monitoring des erreurs
Conclusion : la plupart des attaques “qui marchent” exploitent des erreurs classiques : entrées non filtrées, sorties non échappées, composants non mis à jour, ou serveur mal configuré. En appliquant ces mesures, vous pourrez déjà bloquer une grosse partie des risques.

Par Thibaut Pietri
Derniers articles
Les risques de sécurité liés aux métadonnées des photos
14 août 2019 En photographie numérique, les métadonnées sont stockées à l'intérieur d'un fichier JPG et permettent de décrire un certain nombre d'informations complémentaires. Ces métadonnées représentent un risque de sécurité.
Comment vérifier si votre site internet a été piraté ou infecté ?
9 août 2019 Le piratage d'un site web peut parfois ne pas être visible directement avec un navigateur web. En effet le piratage peut avoir des objectifs variés. Certains ont tout intérêt à rester invisible.
L'authentification à facteurs multiples pour protéger votre site web
7 août 2019 L'authentification à facteurs multiples est un système de sécurité combinant au moins deux modes d'identification différents. Explications.
