Un site WordPress se fait attaquer en moyenne toutes les 40 secondes. La plupart des pirates ne cherchent pas votre site spécifiquement — ils scannent le web à la recherche de failles connues. La bonne nouvelle : 90% de ces attaques échouent si vous avez appliqué les bonnes protections. Voici 15 mesures concrètes, avec le code prêt à l’emploi, pour durcir votre WordPress en 30 minutes.

1. Protéger wp-config.php (2 minutes)

Le fichier wp-config.php contient vos identifiants de base de données. S’il est accessible, votre site est compromis. Première ligne de défense : .htaccess.

# Dans .htaccess à la racine
<Files wp-config.php>
    Require all denied
</Files>

Deuxième niveau : déplacez wp-config.php d’un niveau au-dessus de la racine web si votre hébergement le permet. WordPress cherche automatiquement dans le répertoire parent.

# Structure recommandée
/home/user/
├── wp-config.php       ← ici (hors public_html)
└── public_html/        ← racine web
    ├── wp-admin/
    ├── wp-content/
    └── index.php

2. Bloquer XML-RPC (1 minute)

XML-RPC est la porte d’entrée numéro 1 des attaques par force brute. Si vous n’utilisez pas l’application mobile WordPress ou Jetpack, désactivez-le complètement.

# .htaccess
<Files xmlrpc.php>
    Require all denied
</Files>

3. Cacher l’URL de connexion (3 minutes)

wp-login.php est scanné par des milliers de bots chaque jour. Vous pouvez le bloquer et utiliser une URL personnalisée.

# Solution 1 : WP-CLI (si vous avez un accès SSH)
wp option update whl_page "portail-secret-8x4k"

# Solution 2 : via .htaccess (blocage simple)
<Files wp-login.php>
    Require all denied
</Files>
# Puis créez un fichier PHP avec un nom unique contenant
# un formulaire de connexion personnalisé.

4. Désactiver l’édition de fichiers dans l’admin (1 minute)

Par défaut, un admin WordPress peut éditer les fichiers PHP des plugins et du thème depuis l’interface d’administration. C’est une porte ouverte à l’injection de code si un compte admin est compromis.

// wp-config.php
define('DISALLOW_FILE_EDIT', true);

5. Limiter les révisions d’articles (1 minute)

Les révisions s’accumulent dans la base de données et peuvent représenter des centaines de Mo. Limitez-les pour des raisons de performance ET de sécurité (moins de données exposées en cas de fuite SQL).

// wp-config.php — garder uniquement les 5 dernières révisions
define('WP_POST_REVISIONS', 5);

// Désactiver complètement les révisions (optionnel)
// define('WP_POST_REVISIONS', false);

6. Forcer le HTTPS et HSTS (3 minutes)

Le SSL ne suffit pas. Ajoutez HSTS (HTTP Strict Transport Security) pour forcer les navigateurs à toujours utiliser HTTPS, même si l’utilisateur tape HTTP.

# .htaccess — forcer HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

# Ajouter HSTS (dans la configuration Apache ou .htaccess)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

7. Headers de sécurité HTTP (2 minutes)

Les headers de sécurité protègent vos visiteurs contre les attaques XSS, le clickjacking et le sniffing MIME. Ajoutez ces lignes à votre .htaccess :

# .htaccess — Security headers
<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
    
    # CSP — Content Security Policy (plus restrictif, à adapter)
    # Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';"
</IfModule>

8. Permissions des fichiers (2 minutes)

Des permissions trop permissives permettent à un attaquant de modifier vos fichiers s’il obtient un accès limité au serveur. Vérifiez et corrigez avec ces commandes :

# WordPress : permissions recommandées
find /home/user/public_html -type d -exec chmod 755 {} \;
find /home/user/public_html -type f -exec chmod 644 {} \;

# wp-config.php doit être plus restrictif
chmod 640 wp-config.php

# Vérifier les permissions actuelles
find . -type f -perm /111 -ls  # chercher les fichiers exécutables

9. Salts et clés de sécurité (2 minutes)

Les salts WordPress servent à hasher les cookies d’authentification. S’ils sont compromis ou trop anciens, changez-les. Cela déconnectera tous les utilisateurs — prévenez-les avant.

# Générer de nouveaux salts via l'API WordPress
curl -s https://api.wordpress.org/secret-key/1.1/salt/

Copiez-collez le résultat dans wp-config.php pour remplacer les anciennes clés.

10. Désactiver l’exécution PHP dans wp-content/uploads (2 minutes)

Le dossier uploads ne devrait jamais exécuter de code PHP. Un .htaccess dans ce dossier bloque toute tentative d’exécution.

# /wp-content/uploads/.htaccess
<FilesMatch "\.(php|php5|php7|php8|phtml|phar|pl|py|jsp|asp|sh|cgi)$">
    Require all denied
</FilesMatch>
Options -Indexes

11. Nettoyer la base de données (3 minutes)

Transients expirés, révisions orphelines, métadonnées inutilisées : une base de données propre est plus rapide et plus sûre.

# WP-CLI : nettoyage complet
wp transient delete --all
wp post delete $(wp post list --post_type='revision' --format=ids) --force
wp comment delete $(wp comment list --status=spam --format=ids) --force

# Optimiser les tables
wp db optimize

# Vérifier la taille de la BDD
wp db size

12. Surveiller les comptes administrateur (2 minutes)

Un compte admin créé par un attaquant est la porte dérobée la plus discrète. Vérifiez régulièrement.

# Lister tous les administrateurs
wp user list --role=administrator

# Vérifier les derniers utilisateurs créés
wp user list --orderby=registered --order=desc | head -10

# Supprimer un compte suspect
wp user delete 42 --reassign=1

13. Protection anti-brute-force (3 minutes)

Limitez les tentatives de connexion pour décourager les attaques par dictionnaire. Installez un plugin comme Wordfence, ou ajoutez une règle de rate-limiting au niveau serveur.

# .htaccess — Limiter les requêtes POST à wp-login.php
<IfModule mod_ratelimit.c>
    <Location /wp-login.php>
        SetOutputFilter RATE_LIMIT
        SetEnv rate-limit 5
    </Location>
</IfModule>

14. Sauvegarde automatique (5 minutes)

La sécurité, c’est aussi pouvoir restaurer rapidement. Mettez en place des sauvegardes quotidiennes.

#!/bin/bash
# Sauvegarde quotidienne WordPress
DATE=$(date +%Y-%m-%d)
BACKUP_DIR="/home/user/backups"
mkdir -p $BACKUP_DIR

# Sauvegarde base de données
mysqldump -u user -ppassword db_name | gzip > "$BACKUP_DIR/db-$DATE.sql.gz"

# Sauvegarde fichiers
tar -czf "$BACKUP_DIR/files-$DATE.tar.gz" public_html/

# Garder uniquement les 7 derniers backups
find $BACKUP_DIR -mtime +7 -delete

15. Scanner de vulnérabilités (2 minutes)

Utilisez WPScan pour auditer régulièrement vos plugins et votre thème.

# Scanner un site avec WPScan (gratuit)
wpscan --url https://monsite.com --enumerate vp,vt,tt,cb,dbe,u --output scan-$(date +%Y%m%d).txt

# --enumerate vp = plugins vulnérables
# --enumerate vt = thèmes vulnérables  
# --enumerate u  = énumération utilisateurs
# --enumerate tt = timthumbs (ancien mais classique)

Checklist récapitulative

  1. ✅ wp-config.php protégé et remonté d’un niveau
  2. ✅ XML-RPC bloqué
  3. ✅ URL de connexion cachée
  4. ✅ Édition de fichiers désactivée
  5. ✅ Révisions limitées à 5
  6. ✅ HTTPS + HSTS activé
  7. ✅ Headers de sécurité présents
  8. ✅ Permissions correctes (644/755)
  9. ✅ Salts à jour
  10. ✅ Pas d’exécution PHP dans uploads
  11. ✅ Base de données nettoyée
  12. ✅ Comptes admin audités
  13. ✅ Anti-brute-force actif
  14. ✅ Sauvegarde automatique en place
  15. ✅ Scan WPScan régulier

Ces 15 mesures prennent 30 minutes à mettre en place et bloquent la grande majorité des attaques automatisées. La sécurité WordPress n’est pas un produit que vous installez une fois — c’est une discipline que vous maintenez. Programmez un audit mensuel avec cette checklist et gardez vos plugins à jour.


Sources et références

W
WP Admin Lab

Architecte web full-stack. WordPress, performance, data et sécurité. Notes de terrain, tests reproductibles et retours d'expérience.