Un site WordPress qui n'est ni maintenu ni durci finit presque toujours compromis : 90 % des piratages viennent d'un plugin obsolète, d'un mot de passe faible ou d'une faille XML-RPC. Cette checklist couvre les actions à mener, dans l'ordre, pour passer d'une installation par défaut à une installation que les bots automatisés laissent tranquille.
1. Tenir à jour
La règle numéro un. Chaque jour passé sans mise à jour d'un plugin connu vulnérable est un jour de risque.
- Core WordPress : activez les mises à jour mineures automatiques (déjà actives par défaut depuis WP 3.7).
- Plugins et thèmes : activez les maj auto pour ceux que vous ne modifiez jamais. Les autres, audit manuel hebdomadaire.
- PHP : visez la dernière version supportée (PHP 8.3 ou 8.4 en avril 2026). Pour upgrader côté serveur, ouvrez un ticket.
Voir le guide dédié : mises à jour et maintenance.
2. Comptes et authentification
Identifiants non-devinables
Supprimez tout compte admin, administrator, webmaster, ou portant le nom du domaine. Les bots tentent ces logins en premier.
# Lister les utilisateurs admin
wp user list --role=administrator --fields=ID,user_login,user_email
# Créer un nouveau compte admin
wp user create pierre-admin pierre@exemple.fr --role=administrator --send-email
# Supprimer l'ancien compte admin en réattribuant ses contenus
wp user delete admin --reassign=2
Mots de passe
- Minimum 16 caractères, générés aléatoirement (gestionnaire de mots de passe : Bitwarden, 1Password, KeePass).
- Jamais le même mot de passe sur deux sites.
- Interdisez les mots de passe faibles à vos clients/rédacteurs via le plugin Password Policy Manager ou l'option native de WordPress.
Double authentification (2FA)
Plugin officiel recommandé : Two Factor (wordpress.org/plugins/two-factor), maintenu par l'équipe core. Activez au moins pour les comptes administrateur et éditeur.
Méthodes recommandées : TOTP (Google Authenticator, Aegis, Authy) ou clé WebAuthn/FIDO2.
Limiter les tentatives de connexion
Installez Limit Login Attempts Reloaded. Paramétrage typique : 4 tentatives, lockout 20 min, lockout long 24 h après 4 lockouts.
3. Bloquer XML-RPC
Le fichier xmlrpc.php sert à l'application mobile officielle et à quelques plugins (Jetpack). Si vous ne l'utilisez pas, désactivez-le : c'est un vecteur massif de brute-force distribué.
Méthode 1 — Plugin
Installez Disable XML-RPC. C'est tout.
Méthode 2 — .htaccess
# Dans /var/www/vhosts/mon-domaine.fr/httpdocs/.htaccess
<Files xmlrpc.php>
Require all denied
</Files>
4. Masquer la version WordPress
Par défaut, WordPress affiche sa version dans une balise <meta name="generator"> et dans l'URL des fichiers CSS/JS. Utile aux scanners automatiques pour repérer les versions vulnérables.
Dans le functions.php de votre thème enfant (jamais dans le thème parent, écrasé à la maj) :
// Supprime meta generator
remove_action('wp_head', 'wp_generator');
// Supprime la version des URL d'assets
add_filter('style_loader_src', function($src) {
return remove_query_arg('ver', $src);
});
add_filter('script_loader_src', function($src) {
return remove_query_arg('ver', $src);
});
5. Désactiver l'éditeur de fichiers
Par défaut, un administrateur peut éditer le code des plugins et du thème depuis l'interface. C'est un chemin royal pour un attaquant qui a volé un mot de passe admin.
Dans wp-config.php, avant la ligne /* That's all, stop editing! */ :
define('DISALLOW_FILE_EDIT', true);
Pour aller plus loin et interdire aussi l'installation de plugins/thèmes via l'admin (utile sur un site figé en production) :
define('DISALLOW_FILE_MODS', true);
6. Protéger wp-config.php
Ce fichier contient vos identifiants de base de données et vos clés secrètes. Il doit être illisible depuis le web.
Permissions Unix
# Depuis SSH
cd /var/www/vhosts/mon-domaine.fr/httpdocs
chmod 600 wp-config.php
ls -la wp-config.php
# -rw------- 1 monuser psacln 3521 Apr 23 10:15 wp-config.php
Blocage .htaccess
<Files wp-config.php>
Require all denied
</Files>
Permissions générales recommandées
- Dossiers : 750 (ou 755 si la config Apache le demande).
- Fichiers : 640 (ou 644).
- wp-config.php : 600.
- wp-content/uploads : 750.
Voir le guide permissions Linux.
7. Désactiver l'indexation des dossiers
Sans directive, Apache liste le contenu d'un dossier dépourvu d'index.php. Votre wp-content/uploads devient alors explorable. Ajoutez en tête du .htaccess racine :
Options -Indexes
8. Plugin de sécurité global
Un plugin couvre la plupart des points ci-dessus d'un coup, plus un pare-feu applicatif (WAF) et un scanner de fichiers. Deux choix solides :
- Wordfence Security — WAF, scan de malware, 2FA, blocage IP. Version gratuite très complète.
- Solid Security (ex-iThemes Security) — plus léger, politique de mots de passe, détection de changement de fichier.
Ne cumulez jamais deux plugins de sécurité, ils se marchent dessus.
9. Audit régulier des plugins
Ritualisez (une fois par mois) :
- Liste des plugins actifs :
wp plugin list --status=active. - Supprimez ceux qui ne servent plus (désactiver ne suffit pas, le code reste sur le serveur et peut être vulnérable).
- Vérifiez la date de dernière mise à jour de chaque plugin sur WordPress.org. Plus de 2 ans sans maj = à remplacer.
- Vérifiez les alertes de sécurité : Patchstack ou WPVulnerability.
10. Sauvegardes applicatives
Nous faisons des sauvegardes serveur quotidiennes et les conservons selon le SLA de votre offre. C'est une assurance-vie de dernier recours — restaurer tout un site depuis un snapshot serveur prend du temps.
Pour un redémarrage rapide en cas de plugin cassé ou de maj foireuse, ajoutez une sauvegarde applicative côté WordPress : UpdraftPlus, BackWPup ou Duplicator, stockées hors serveur (S3 compatible, Nextcloud, Google Drive).
dev-agence le temps d'un chantier, et personne ne le supprime à la livraison. Six mois plus tard, le mot de passe a fuité sur une base volée, et le site est compromis. Audit mensuel des comptes admin et éditeur : si vous ne reconnaissez pas, vous supprimez.
Checklist rapide
- Core, plugins, thèmes, PHP à jour.
- Pas de compte
admin. Tous les admins en 2FA. - XML-RPC bloqué (sauf cas explicite).
- Limit Login Attempts installé.
DISALLOW_FILE_EDITactivé.wp-config.phpenchmod 600et bloqué par.htaccess.Options -Indexesdans le.htaccessracine.- Un plugin de sécurité global (pas deux).
- Sauvegarde applicative hors serveur.