Pourquoi WordPress est massivement attaqué ?
WordPress propulse 43 % des sites web mondiaux — c’est aussi sa plus grande faiblesse : chaque vulnérabilité dans un plugin populaire (RankMath, Elementor, WooCommerce) crée des millions de cibles potentielles. Au Sénégal, beaucoup d’agences livrent des sites WordPress sans les durcir, sans 2FA et avec l’utilisateur « admin » par défaut. Conséquence : 80 % des sites piratés au Sénégal le sont à cause de plugins non mis à jour. Les 10 actions ci-dessous prennent 1 heure et bloquent 95 % des attaques automatisées.
Pourquoi les sites WordPress sont-ils cibles
WordPress alimente plus de 40% des sites web dans le monde, ce qui en fait la cible préférée des hackers. Un site WordPress piraté peut servir a envoyer du spam, héberger du phishing, miner des cryptomonnaies, rediriger vers des sites malveillants ou voler les données de vos clients.
Au Sénégal, de nombreux sites d’entreprises et e-commerce tournent sur WordPress avec WooCommerce. Un piratage peut signifier la perte de commandes, de données clients et de confiance. Ce guide couvre les protections concrètes, du basique a l’avancé.
Sécurité de base : les 10 actions immediates
1. Mises a jour (la protection numéro 1)
// Dans wp-config.php : activer les mises a jour automatiques
define('WP_AUTO_UPDATE_CORE', true);
// Mises a jour automatiques des plugins et thèmes
// Tableau de bord > Extensions > cocher "Activer les mises a jour auto"
// Tableau de bord > Apparence > Thèmes > cocher "Activer les mises a jour auto"
// Ou via functions.php pour forcer les mises a jour auto des plugins
add_filter('auto_update_plugin', '__return_true');
add_filter('auto_update_theme', '__return_true');
80% des sites WordPress piratés le sont a cause de plugins ou thèmes non mis a jour.
2. Identifiants sécurisés
- Supprimez le compte « admin » par défaut. Créez un administrateur avec un nom unique
- Mot de passe de 16+ caracteres genere aleatoirement
- Chaque utilisateur doit avoir son propre compte (pas de compte partage)
- Attribuez les rôles corrects : un redacteur n’a pas besoin d’être administrateur
3. Protéger wp-login.php
# Dans .htaccess : limiter l'accès a wp-login.php par IP
# (si vous avez une IP fixe)
Order Deny,Allow
Deny from all
Allow from VOTRE.IP.FIXE
# Alternative : protéger par mot de passe supplementaire
# Créer un fichier .htpasswd
htpasswd -c /home/user/.htpasswd monuser
# Dans .htaccess
AuthType Basic
AuthName "Zone Protegee"
AuthUserFile /home/user/.htpasswd
Require valid-user
4. Désactiver XML-RPC
XML-RPC est un ancien protocole rarement utilise mais souvent exploite pour des attaques brute-force :
// Dans functions.php
add_filter('xmlrpc_enabled', '__return_false');
// Ou dans .htaccess (plus efficace car bloque avant PHP)
Order Deny,Allow
Deny from all
5. Désactiver l’editeur de fichiers
// Dans wp-config.php : empecher la modification de fichiers depuis l'admin
define('DISALLOW_FILE_EDIT', true);
// Si un hacker obtient un accès admin, il ne pourra pas
// modifier le code des plugins/thèmes via l'interface
6. Prefixe de table personnalise
// Dans wp-config.php, changez le prefixe par défaut
// Au lieu de :
$table_prefix = 'wp_';
// Utilisez quelque chose de unique :
$table_prefix = 'itsc7k_';
// ATTENTION : a faire AVANT l'installation ou avec un outil de migration
7. Masquer la version de WordPress
// Dans functions.php
remove_action('wp_head', 'wp_generator');
// Supprimer aussi la version des scripts et styles
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);
});
8. Protéger wp-config.php
# Dans .htaccess
Order Allow,Deny
Deny from all
# Deplacer wp-config.php un niveau au-dessus du dossier public
# Si WordPress est dans /var/www/html/
# Deplacez wp-config.php dans /var/www/
# WordPress le trouvera automatiquement
9. Désactiver le listage des répertoires
# Dans .htaccess
Options -Indexes
# Empeche l'accès a /wp-content/uploads/ et la navigation dans vos dossiers
10. HTTPS obligatoire
// Dans wp-config.php
define('FORCE_SSL_ADMIN', true);
// Redirection HTTP vers HTTPS dans .htaccess
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Sécurité avancée : headers et configuration serveur
Headers de sécurité (Nginx)
# Dans le bloc server de Nginx
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self' https:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https:; style-src 'self' 'unsafe-inline' https:; img-src 'self' data: https:;" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
# Cacher la version de Nginx
server_tokens off;
Headers de sécurité (Apache .htaccess)
# Headers de sécurité pour Apache
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# Désactiver la signature serveur
ServerSignature Off
Protection contre les attaques brute-force
Avec Fail2Ban (serveur VPS)
# Installer Fail2Ban
sudo apt install fail2ban -y
# Créer le filtre WordPress
sudo nano /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^ .* "POST /wp-login.php
^ .* "POST /xmlrpc.php
# Créer la jail
sudo nano /etc/fail2ban/jail.local
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 3600
findtime = 300
# Redemarrer Fail2Ban
sudo systemctl restart fail2ban
# Vérifier le statut
sudo fail2ban-client status wordpress
Avec un plugin (hébergement mutualise)
Si vous n’avez pas accès au serveur, utilisez un plugin :
- Limit Login Attempts Reloaded (gratuit) : bloque les IP après X tentatives echouees
- WPS Hide Login (gratuit) : change l’URL de connexion de /wp-login.php vers une URL personnalisee (/mon-accès-secret par exemple)
- Wordfence (gratuit/premium) : pare-feu applicatif + protection brute-force + scan de malware
Sécuriser WooCommerce (e-commerce)
Pour les boutiques en ligne sénégalaises avec paiement Wave/Orange Money :
// Dans functions.php : sécuriser WooCommerce
// 1. Forcer SSL sur les pages de paiement
add_action('template_redirect', function() {
if (is_checkout() && !is_ssl()) {
wp_redirect(str_replace('http:', 'https:', home_url($_SERVER['REQUEST_URI'])), 301);
exit;
}
});
// 2. Limiter les tentatives de commande (anti-fraude)
add_action('woocommerce_checkout_process', function() {
$ip = $_SERVER['REMOTE_ADDR'];
$transient_key = 'order_limit_' . md5($ip);
$count = get_transient($transient_key);
if ($count && $count >= 5) {
wc_add_notice('Trop de tentatives. Reessayez dans 1 heure.', 'error');
}
set_transient($transient_key, ($count ? $count + 1 : 1), 3600);
});
// 3. Désactiver l'enumeration des utilisateurs
add_action('template_redirect', function() {
if (isset($_GET['author']) && is_numeric($_GET['author'])) {
wp_redirect(home_url(), 301);
exit;
}
});
Sauvegardes WordPress
Sauvegarde automatisee avec WP-CLI
#!/bin/bash
# Script de sauvegarde WordPress quotidien
SITE_DIR="/var/www/monsite.sn"
BACKUP_DIR="/backups/wordpress"
DATE=$(date +%Y-%m-%d)
mkdir -p "$BACKUP_DIR/$DATE"
# Sauvegarde base de données
wp db export "$BACKUP_DIR/$DATE/database.sql" --path=$SITE_DIR
# Sauvegarde fichiers
tar -czf "$BACKUP_DIR/$DATE/files.tar.gz" -C $SITE_DIR .
# Supprimer les sauvegardes de plus de 30 jours
find $BACKUP_DIR -type d -mtime +30 -exec rm -rf {} +
# Envoyer vers un stockage distant (optionnel)
rclone copy "$BACKUP_DIR/$DATE" remote:backups/wordpress/$DATE
echo "Sauvegarde terminée : $BACKUP_DIR/$DATE"
# Cron pour exécuter chaque nuit a 3h
0 3 * * * /home/user/scripts/backup-wordpress.sh >> /var/log/wp-backup.log 2>&1
Scanner et nettoyer un site pirate
Signes d’un piratage
- Redirections vers des sites suspects
- Pages de spam ou de phishing ajoutees a votre site
- Utilisateurs administrateurs inconnus dans le tableau de bord
- Fichiers suspects dans wp-content/uploads/ ou a la racine
- Google affiche « Ce site peut être pirate » dans les résultats
- Emails de spam envoyés depuis votre serveur
Nettoyage étape par étape
# 1. Scanner avec WP-CLI
wp plugin verify-checksums --all --path=/var/www/monsite.sn
wp core verify-checksums --path=/var/www/monsite.sn
# 2. Chercher les fichiers suspects
find /var/www/monsite.sn -name "*.php" -newer /var/www/monsite.sn/wp-config.php -mtime -7
find /var/www/monsite.sn -name "*.php" | xargs grep -l "eval(base64_decode"
find /var/www/monsite.sn -name "*.php" | xargs grep -l "exec(\|system(\|passthru("
find /var/www/monsite.sn/wp-content/uploads -name "*.php"
# 3. Vérifier les utilisateurs admin
wp user list --role=administrator --path=/var/www/monsite.sn
# Supprimer les comptes inconnus
wp user delete ID_SUSPECT --reassign=1 --path=/var/www/monsite.sn
# 4. Reinstaller WordPress proprement
wp core download --force --path=/var/www/monsite.sn
# 5. Reinstaller tous les plugins depuis le depot officiel
wp plugin install PLUGIN_NAME --force --path=/var/www/monsite.sn
# 6. Changer tous les mots de passe
wp user update 1 --user_pass="NouveauMotDePasse" --path=/var/www/monsite.sn
# 7. Regenerer les clés de sécurité
wp config shuffle-salts --path=/var/www/monsite.sn
Plugins de sécurité recommandes
| Plugin | Gratuit | Points forts | Ideal pour |
|---|---|---|---|
| Wordfence | Oui (premium optionnel) | Pare-feu, scan malware, protection brute-force | Protection complété |
| Sucuri Security | Oui (premium optionnel) | Audit, scan, CDN/WAF (premium) | Sites a fort trafic |
| iThemes Security | Oui (premium optionnel) | Durcissement, 2FA, surveillance fichiers | Facilite d’utilisation |
| WPS Hide Login | Oui | Changer l’URL de connexion | Protection basique |
| Limit Login Attempts | Oui | Anti brute-force simple | Solution légère |
Erreurs fréquentes
1. Plugins « nulled » ou pirates
Cause : on télécharge Elementor Pro ou Yoast Premium « gratuit » depuis nulledfree.eu ou similar. 9 fois sur 10, le plugin contient une backdoor qui crée un compte admin caché ou injecte du SEO spam.
Solution : JAMAIS de plugin nulled. Pour les plugins payants : licence officielle ou alternative gratuite. Scannez avec WPScan CLI et Patchstack les CVE de vos plugins.
2. Compte admin par défaut conservé
Cause : 70 % des attaques brute-force ciblent le login admin. Sans le supprimer, vous offrez la moitié de l’équation à l’attaquant.
Solution : créez un nouvel admin avec un nom non-prévisible (pas « admin2 », « administrator », ou votre prénom), connectez-vous avec, puis supprimez l’ancien admin en réassignant son contenu au nouveau compte.
3. wp-config.php avec mots de passe DB en clair, sans permissions strictes
Cause : wp-config.php est en mode 644 et accessible. Une faille de plugin permettant la lecture de fichier expose vos credentials MySQL.
Solution : permissions chmod 600 wp-config.php et chown www-data:www-data wp-config.php. Mieux : déplacez-le un dossier au-dessus du document root (WordPress le trouve automatiquement).
4. Sauvegardes stockées sur le même serveur
Cause : on utilise UpdraftPlus en sauvegardant dans /wp-content/backups/. Si le serveur est compromis (ou si un ransomware tape Linux), les backups partent avec le site.
Solution : sauvegarde off-site : Backblaze B2 (~6 USD/To/mois), Google Drive, ou un VPS distinct via rclone. Testez la restauration au moins une fois par trimestre.
5. WAF Cloudflare gratuit considéré suffisant
Cause : on active Cloudflare Free et on pense être protégé. Le plan gratuit n’inclut pas le WAF (réservé Pro+, ~20 USD/mois) et bloque seulement les bots les plus évidents.
Solution : combinez Cloudflare Free (DDoS, rate limiting basique) + un plugin sécurité côté WP (Wordfence ou iThemes Security) pour la couche applicative. Pour les sites e-commerce, Cloudflare Pro ou Sucuri WAF est un bon investissement.
Checklist sécurité WordPress
- WordPress, plugins et thèmes a jour (mises a jour auto activees)
- Compte « admin » supprime, identifiants forts et uniques
- Authentification a deux facteurs activée pour les admins
- XML-RPC désactivé
- Editeur de fichiers désactivé (DISALLOW_FILE_EDIT)
- wp-config.php protégé
- Listage de répertoires désactivé
- HTTPS force sur tout le site
- Headers de sécurité configurés
- Protection brute-force activé (Fail2Ban ou plugin)
- Sauvegardes automatiques quotidiennes avec copie deconnectee
- Plugins et thèmes inutilises supprimes (pas juste desactives)
- Permissions fichiers correctes (644 pour fichiers, 755 pour dossiers)
Pour étoffer le tableau
- Créer des mots de passe inviolables — la base avant tout durcissement WP.
- Configurer la 2FA partout — indispensable pour les comptes administrateurs WordPress.
- Créer un sitemap XML — restez bien indexé après nettoyage post-piratage.
- Configurer les redirections 301 — utile pour rétablir un site nettoyé.
- Référence officielle : WordPress.org — Hardening WordPress et WPScan Vulnerability Database.
- Outils : Wordfence, Patchstack (alertes CVE), WP-CLI.
Hostinger pour vos premiers déploiements
Le panel hPanel reste l’un des plus accessibles du marché pour les débutants en self-hosting.
Lien d affiliation. Si vous achetez via ce lien, le blog reçoit une petite commission sans surcoût pour vous.