WordPress propulse une part considérable du web, ce qui en fait une cible permanente des robots d’attaque. Dans la très grande majorité des incidents que nous traitons, ce n’est pas le cœur de WordPress qui est en cause, mais une extension obsolète, un compte administrateur faible ou une configuration laxiste. Autrement dit, des problèmes évitables.
Ce guide rassemble 20 mesures de durcissement, de la plus simple à la plus technique, avec les extraits de configuration et, surtout, les pièges qui peuvent casser un site en production. Car sécuriser, c’est bien ; sécuriser sans régression, c’est mieux.
L’essentiel en 30 secondes
- 80 % du risque se traite avec : mises à jour, suppression du superflu, comptes nominatifs avec double authentification, sauvegardes externalisées testées.
- Sur la couche serveur : XML-RPC bloqué, fichiers sensibles inaccessibles, en-têtes HTTP de sécurité, éditeur de fichiers désactivé.
- Toujours : copie du fichier d’origine avant modification, une modification à la fois, vérification des pages clés après chaque étape.
Niveau 1 : l’hygiène de base
1. Mettre à jour le cœur, les extensions et les thèmes
C’est la mesure la plus efficace. Activez les mises à jour automatiques mineures du cœur et des extensions de confiance. Pour les mises à jour majeures (passage de WooCommerce, d’un constructeur de pages ou d’un LMS à une nouvelle version majeure), testez d’abord sur une préproduction : un changement d’API peut casser un module de paiement ou une mise en page.
2. Supprimer ce qui ne sert pas
Une extension désactivée reste présente sur le serveur et peut contenir une faille exploitable directement. Supprimez les extensions et thèmes inutilisés, en gardant un thème par défaut récent comme solution de secours.
3. Éviter les extensions abandonnées ou « nulled »
Vérifiez la date de dernière mise à jour, le nombre d’installations et la réactivité du support. N’installez jamais de version piratée d’une extension payante : elles contiennent très souvent des portes dérobées.
4. Des comptes nominatifs et le moindre privilège
Pas de compte « admin » partagé. Chaque intervenant a son compte, avec le rôle minimal : un rédacteur n’a pas besoin d’être administrateur. Auditez les comptes tous les trimestres et supprimez ceux des anciens prestataires.
5. La double authentification
Obligatoire pour tous les comptes ayant des droits d’édition. Une application d’authentification, ou mieux une clé de sécurité, rend inutile la plupart des attaques par force brute ou par vol de mot de passe.
Niveau 2 : réduire la surface d’attaque
6. Bloquer XML-RPC
Si vous n’utilisez ni l’application mobile WordPress ni Jetpack, bloquez xmlrpc.php, cible classique des attaques par force brute amplifiées :
<Files xmlrpc.php>
Require all denied
</Files>
7. Limiter les tentatives de connexion
Via une extension de sécurité ou le pare-feu de l’hébergeur. Évitez en revanche de changer l’URL de connexion si cela complique la maintenance : c’est un gain marginal.
8. Empêcher l’énumération des utilisateurs
Les URL /?author=1 et le point d’accès REST /wp-json/wp/v2/users peuvent révéler les identifiants. Vérifiez qu’ils répondent en erreur pour un visiteur non connecté.
9. Désactiver l’éditeur de fichiers
Dans wp-config.php :
define( 'DISALLOW_FILE_EDIT', true );
Un attaquant qui obtient un accès administrateur ne pourra plus injecter de code depuis l’interface. Contrepartie : les modifications du thème enfant se feront par SFTP ou par le gestionnaire de fichiers de l’hébergeur.
10. Bloquer l’accès aux fichiers sensibles
readme.html et license.txt révèlent la version, les sauvegardes SQL et les journaux d’erreurs peuvent exposer des données. Piège fréquent : la directive <Files "readme.html|license.txt"> ne fonctionne pas, car <Files> n’interprète pas l’alternative « | » sans le modificateur ~. Nous avons trouvé cette erreur sur des configurations générées automatiquement. La bonne syntaxe :
<FilesMatch "^(readme\.html|license\.txt)$">
Require all denied
</FilesMatch>
11. Interdire l’exécution de PHP dans les uploads
Le dossier wp-content/uploads ne doit contenir que des médias. Un fichier .htaccess dans ce dossier peut y interdire l’exécution de scripts PHP, ce qui neutralise de nombreuses portes dérobées téléversées.
12. Désactiver le listage des répertoires
Options -Indexes
Niveau 3 : la couche HTTP
13. Forcer le HTTPS et ajouter HSTS
Redirection 301 de tout le trafic HTTP vers HTTPS, puis en-tête Strict-Transport-Security. N’ajoutez includeSubDomains que si tous vos sous-domaines ont un certificat valide.
14. Les en-têtes de sécurité
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Strict-Transport-Security "max-age=31536000"
</IfModule>
Piège : X-Frame-Options: DENY casse les constructeurs de pages qui affichent votre site dans une iframe d’édition. SAMEORIGIN protège du détournement de clic sans gêner l’éditeur.
15. Construire progressivement une CSP
La Content-Security-Policy est l’en-tête le plus puissant contre l’injection de scripts, mais aussi le plus risqué sur un site avec constructeur de pages, outils d’analyse et paiement en ligne. Commencez en Content-Security-Policy-Report-Only, observez, puis durcissez.
Niveau 4 : résilience et surveillance
16. Des sauvegardes externalisées et testées
Base de données et fichiers, quotidiennement, avec une copie hors de l’hébergement et un test de restauration régulier sur une préproduction.
17. Un pare-feu applicatif
Côté hébergeur, via une extension ou un service en amont. Il filtre les attaques connues avant qu’elles n’atteignent WordPress.
18. Le contrôle d’intégrité des fichiers
Comparer régulièrement les fichiers du cœur et des extensions avec les versions officielles permet de détecter une injection de code.
19. Le nettoyage des restes
Anciens plugins de cache désinstallés qui ont laissé des règles dans .htaccess et des répertoires de pages figées, fichiers de test, sauvegardes oubliées à la racine : faites l’inventaire. Nous avons déjà trouvé un ancien cache de pages encore actif dans la configuration alors que l’extension avait été supprimée depuis longtemps.
20. La surveillance de disponibilité
Un service gratuit de surveillance vous alerte quand le site tombe. Sans lui, une panne peut durer des jours, avec des conséquences directes sur le référencement : un site en erreur serveur prolongée finit par sortir de l’index.
La méthode pour ne rien casser
- Sauvegarde complète avant de commencer.
- Une modification à la fois, avec une copie du fichier d’origine.
- Après chaque étape : accueil, connexion, panier, paiement, formulaires, éditeur de pages.
- Purge des caches (extension, serveur, CDN) avant de conclure.
- Journal des modifications, pour pouvoir revenir en arrière.
Questions fréquentes
Une extension de sécurité suffit-elle ?
Elle aide (pare-feu, limitation des connexions, alertes), mais ne remplace ni les mises à jour, ni les sauvegardes, ni une bonne gestion des comptes.
Faut-il changer le préfixe des tables de la base de données ?
C’est un gain marginal, avec un risque de casse lors du changement. Concentrez vos efforts sur les mesures ci-dessus.
Faut-il cacher la version de WordPress ?
C’est un complément utile mais secondaire : les robots testent les failles sans regarder la version. Mettre à jour reste la vraie protection.
Mon site a été piraté, que faire ?
Mettez-le en maintenance, changez tous les mots de passe (WordPress, base de données, hébergement, FTP), restaurez une sauvegarde saine, puis identifiez et corrigez la faille avant de remettre en ligne.
Mon hébergeur s’occupe-t-il de la sécurité ?
Il sécurise le serveur, mais pas vos extensions, vos comptes ni votre configuration. C’est une responsabilité partagée. Nous proposons des audits de sécurité de sites web et la maintenance WordPress.
Besoin d’un accompagnement ?
MPCÂBLE Solutions Informatiques (MPCSI) accompagne particuliers, entreprises, associations et collectivités depuis Gaudiès, en Ariège : sur site en Occitanie, principalement dans un rayon de 40 km (Pamiers, Foix, Mirepoix, Saverdun, Castelnaudary), et à distance partout en France. Demandez un devis gratuit ou appelez le 05 32 42 99 98.
