Pourquoi les sites WordPress sont-ils cibles
WordPress alimente plus de 40% des sites web dans le monde, ce qui en fait la cible preferee des hackers. Un site WordPress pirate peut servir a envoyer du spam, heberger du phishing, miner des cryptomonnaies, rediriger vers des sites malveillants ou voler les donnees de vos clients.
Au Senegal, de nombreux sites d’entreprises et e-commerce tournent sur WordPress avec WooCommerce. Un piratage peut signifier la perte de commandes, de donnees clients et de confiance. Ce guide couvre les protections concretes, du basique a l’avance.
Securite de base : les 10 actions immediates
1. Mises a jour (la protection numero 1)
// Dans wp-config.php : activer les mises a jour automatiques
define('WP_AUTO_UPDATE_CORE', true);
// Mises a jour automatiques des plugins et themes
// Tableau de bord > Extensions > cocher "Activer les mises a jour auto"
// Tableau de bord > Apparence > Themes > 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 pirates le sont a cause de plugins ou themes non mis a jour.
2. Identifiants securises
- Supprimez le compte « admin » par defaut. Creez 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 roles corrects : un redacteur n’a pas besoin d’etre administrateur
3. Proteger wp-login.php
# Dans .htaccess : limiter l'acces a wp-login.php par IP
# (si vous avez une IP fixe)
Order Deny,Allow
Deny from all
Allow from VOTRE.IP.FIXE
# Alternative : proteger par mot de passe supplementaire
# Creer un fichier .htpasswd
htpasswd -c /home/user/.htpasswd monuser
# Dans .htaccess
AuthType Basic
AuthName "Zone Protegee"
AuthUserFile /home/user/.htpasswd
Require valid-user
4. Desactiver 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. Desactiver 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 acces admin, il ne pourra pas
// modifier le code des plugins/themes via l'interface
6. Prefixe de table personnalise
// Dans wp-config.php, changez le prefixe par defaut
// 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. Proteger 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. Desactiver le listage des repertoires
# Dans .htaccess
Options -Indexes
# Empeche l'acces 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]
Securite avancee : headers et configuration serveur
Headers de securite (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 securite (Apache .htaccess)
# Headers de securite 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"
# Desactiver la signature serveur
ServerSignature Off
Protection contre les attaques brute-force
Avec Fail2Ban (serveur VPS)
# Installer Fail2Ban
sudo apt install fail2ban -y
# Creer le filtre WordPress
sudo nano /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^ .* "POST /wp-login.php
^ .* "POST /xmlrpc.php
# Creer 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
# Verifier le statut
sudo fail2ban-client status wordpress
Avec un plugin (hebergement mutualise)
Si vous n’avez pas acces au serveur, utilisez un plugin :
- Limit Login Attempts Reloaded (gratuit) : bloque les IP apres X tentatives echouees
- WPS Hide Login (gratuit) : change l’URL de connexion de /wp-login.php vers une URL personnalisee (/mon-acces-secret par exemple)
- Wordfence (gratuit/premium) : pare-feu applicatif + protection brute-force + scan de malware
Securiser WooCommerce (e-commerce)
Pour les boutiques en ligne senegalaises avec paiement Wave/Orange Money :
// Dans functions.php : securiser 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. Desactiver 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 donnees
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 terminee : $BACKUP_DIR/$DATE"
# Cron pour executer 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 etre pirate » dans les resultats
- Emails de spam envoyes depuis votre serveur
Nettoyage etape par etape
# 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. Verifier 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 cles de securite
wp config shuffle-salts --path=/var/www/monsite.sn
Plugins de securite recommandes
| Plugin | Gratuit | Points forts | Ideal pour |
|---|---|---|---|
| Wordfence | Oui (premium optionnel) | Pare-feu, scan malware, protection brute-force | Protection complete |
| 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 legere |
Checklist securite WordPress
- WordPress, plugins et themes a jour (mises a jour auto activees)
- Compte « admin » supprime, identifiants forts et uniques
- Authentification a deux facteurs activee pour les admins
- XML-RPC desactive
- Editeur de fichiers desactive (DISALLOW_FILE_EDIT)
- wp-config.php protege
- Listage de repertoires desactive
- HTTPS force sur tout le site
- Headers de securite configures
- Protection brute-force active (Fail2Ban ou plugin)
- Sauvegardes automatiques quotidiennes avec copie deconnectee
- Plugins et themes inutilises supprimes (pas juste desactives)
- Permissions fichiers correctes (644 pour fichiers, 755 pour dossiers)