ITSkillsCenter
Cybersécurité

Sécuriser WooCommerce : checklist 30 points pour le e-commerce africain

13 min de lecture

Lecture : 16 minutes · Niveau : intermédiaire · Mise à jour : avril 2026

Ce tutoriel donne les commandes exactes, configs nginx/Apache, snippets PHP et commandes WP-CLI pour appliquer 30 hardening WooCommerce. Tout est testé sur Ubuntu 22.04 + PHP 8.2 + WordPress 6.x. Chaque section est un checkpoint exécutable individuellement.

Voir aussi → WordPress PME Afrique : guide complet, Cybersécurité PME Sénégal : guide complet.


Sommaire

  1. HTTPS Let’s Encrypt + redirection forcée
  2. 2FA admin via WP-CLI
  3. Hardening wp-config.php
  4. Headers de sécurité nginx
  5. Limiter login brute force (fail2ban)
  6. Désactiver XML-RPC et REST endpoints sensibles
  7. Audit plugins WP-CLI
  8. Backup automatisé chiffré (script bash)
  9. Tests de la checklist
  10. Checklist 30 points résumée
  11. FAQ

1. HTTPS Let’s Encrypt + redirection forcée

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d boutique.ma-pme.sn -d www.boutique.ma-pme.sn --redirect

# Renouvellement auto
sudo systemctl status certbot.timer
# Doit afficher : active (running)

Forcer HTTPS dans wp-config.php :

define( 'FORCE_SSL_ADMIN', true );

// Si derrière un proxy Cloudflare/AWS ALB
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) &&
     strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https' ) !== false ) {
    $_SERVER['HTTPS'] = 'on';
}

Test : curl -I http://boutique.ma-pme.sn doit retourner 301 Moved Permanently vers HTTPS.


2. 2FA admin via WP-CLI

Installer le plugin Two Factor (officiel WordPress.org) :

cd /var/www/boutique
sudo -u www-data wp plugin install two-factor --activate

Forcer 2FA pour tous les administrateurs via mu-plugin :

sudo -u www-data nano wp-content/mu-plugins/force-2fa.php
<?php
add_filter( 'two_factor_enabled_providers_for_user', function( $providers, $user_id ) {
    $user = get_userdata( $user_id );
    if ( in_array( 'administrator', $user->roles, true ) ) {
        if ( empty( $providers ) ) {
            return [ 'Two_Factor_Totp' ];
        }
    }
    return $providers;
}, 10, 2 );

Bloquer la connexion sans 2FA pour les admins :

add_action( 'wp_login', function( $user_login, $user ) {
    if ( in_array( 'administrator', $user->roles, true ) ) {
        $providers = Two_Factor_Core::get_enabled_providers_for_user( $user );
        if ( empty( $providers ) ) {
            wp_logout();
            wp_redirect( home_url( '/2fa-required' ) );
            exit;
        }
    }
}, 10, 2 );

Vérifier : se reconnecter en admin → on doit être redirigé vers la config TOTP avant accès au dashboard.


3. Hardening wp-config.php

Régénérer les clés de sécurité :

curl -s https://api.wordpress.org/secret-key/1.1/salt/

Copier la sortie dans wp-config.php (remplacer le bloc AUTH_KEYNONCE_SALT).

Préfixe de tables non-wp_ : si déjà installé, migrer via WP-CLI :

# 1. Backup
sudo -u www-data wp db export backup-before-prefix-change.sql

# 2. Changer dans wp-config.php
$table_prefix = 'wpx9k_';

# 3. Renommer les tables
mysql -u USER -p DB <<EOF
RENAME TABLE wp_options TO wpx9k_options;
RENAME TABLE wp_users TO wpx9k_users;
RENAME TABLE wp_usermeta TO wpx9k_usermeta;
-- … répéter pour toutes les tables wp_*
EOF

# 4. Update des références internes
sudo -u www-data wp search-replace 'wp_user_roles' 'wpx9k_user_roles' --all-tables
sudo -u www-data wp option update wp_user_roles --skip-plugins --skip-themes

Désactiver l’éditeur de fichiers in-app (vital) :

define( 'DISALLOW_FILE_EDIT', true );
define( 'DISALLOW_FILE_MODS', true );  // Bloque aussi install/update via UI

Limiter les révisions (perf et empreinte) :

define( 'WP_POST_REVISIONS', 5 );
define( 'AUTOSAVE_INTERVAL', 300 );

Permissions strictes wp-config :

sudo chmod 640 /var/www/boutique/wp-config.php
sudo chown www-data:www-data /var/www/boutique/wp-config.php

4. Headers de sécurité nginx

Ajouter dans /etc/nginx/sites-available/boutique (bloc server HTTPS) :

# HSTS - 1 an, sous-domaines inclus
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

# Empêche le sniffing MIME
add_header X-Content-Type-Options "nosniff" always;

# Anti-clickjacking
add_header X-Frame-Options "SAMEORIGIN" always;

# Référer policy
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

# Permissions Policy (anciennement Feature-Policy)
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(self)" always;

# CSP (à adapter selon vos scripts tiers)
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://js.stripe.com https://www.googletagmanager.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com; frame-src https://js.stripe.com;" always;
sudo nginx -t && sudo systemctl reload nginx

Test :

curl -I https://boutique.ma-pme.sn | grep -E "Strict|X-|Referrer|Permissions|Content-Security"

Scoring : soumettre l’URL à securityheaders.com — viser A au minimum, A+ si CSP stricte.


5. Limiter login brute force (fail2ban)

sudo apt install fail2ban -y
sudo nano /etc/fail2ban/jail.d/wordpress.local
[wordpress]
enabled = true
filter = wordpress
logpath = /var/log/nginx/access.log
port = http,https
maxretry = 5
findtime = 600
bantime = 3600
sudo nano /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST>.*"(GET|POST) /wp-login\.php.*" 200
            ^<HOST>.*"(GET|POST) /xmlrpc\.php.*" 200
ignoreregex =
sudo systemctl restart fail2ban
sudo fail2ban-client status wordpress

Tester :

# Depuis une autre machine, lancer 6 logins échoués vers /wp-login.php
for i in {1..6}; do
  curl -s -d 'log=admin&pwd=wrong' https://boutique.ma-pme.sn/wp-login.php
done
# La 6e tentative doit échouer avec connexion refusée pendant 1h

6. Désactiver XML-RPC et REST endpoints sensibles

Bloquer XML-RPC dans nginx :

location = /xmlrpc.php {
    deny all;
    access_log off;
    log_not_found off;
}

Désactiver enumeration des users via REST :

// mu-plugins/disable-user-enum.php
add_filter( 'rest_endpoints', function( $endpoints ) {
    if ( ! is_user_logged_in() ) {
        unset( $endpoints['/wp/v2/users'] );
        unset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
    }
    return $endpoints;
});

// Bloquer ?author=1 énumération
add_action( 'init', function() {
    if ( ! is_admin() && isset( $_GET['author'] ) ) {
        wp_die( 'Forbidden', 403 );
    }
});

Test :

curl -s https://boutique.ma-pme.sn/wp-json/wp/v2/users
# Doit renvoyer [] ou 401, pas la liste des users

curl -I https://boutique.ma-pme.sn/?author=1
# Doit renvoyer 403

7. Audit plugins WP-CLI

Lister tous les plugins avec versions et statut :

sudo -u www-data wp plugin list --format=table

Identifier les plugins inactifs (à supprimer) :

sudo -u www-data wp plugin list --status=inactive --field=name

Vérifier les CVE connues sur les plugins installés :

# Installer wpscan (Ruby)
sudo apt install ruby-dev -y
sudo gem install wpscan

# API token gratuit sur wpscan.com
wpscan --url https://boutique.ma-pme.sn \
  --api-token VOTRE_TOKEN \
  --enumerate vp,vt

Sortie type :

[i] Plugin(s) Identified:
[+] woocommerce
 | Version: 8.5.1 (latest: 8.5.2)
 | Vulnerabilities:
 |   - Stored XSS in product reviews (CVE-2024-XXXX)

Mise à jour batch :

sudo -u www-data wp plugin update --all
sudo -u www-data wp core update
sudo -u www-data wp theme update --all

Cron de mise à jour mineure auto (wp-config.php) :

define( 'WP_AUTO_UPDATE_CORE', 'minor' );
add_filter( 'auto_update_plugin', '__return_true' );

8. Backup automatisé chiffré (script bash)

/usr/local/bin/backup-woo.sh :

#!/bin/bash
set -euo pipefail

SITE_DIR="/var/www/boutique"
BACKUP_DIR="/var/backups/woocommerce"
DATE=$(date +%F-%H%M)
GPG_RECIPIENT="ops@ma-pme.sn"

mkdir -p "$BACKUP_DIR"

# 1. Dump DB via WP-CLI
sudo -u www-data wp --path="$SITE_DIR" db export "$BACKUP_DIR/db-$DATE.sql"

# 2. Tar des fichiers (exclut cache + node_modules)
tar -czf "$BACKUP_DIR/files-$DATE.tar.gz" \
  --exclude="$SITE_DIR/wp-content/cache" \
  --exclude="$SITE_DIR/wp-content/uploads/cache" \
  -C "$(dirname "$SITE_DIR")" "$(basename "$SITE_DIR")"

# 3. Chiffrement GPG
gpg --batch --yes --encrypt --recipient "$GPG_RECIPIENT" \
  "$BACKUP_DIR/db-$DATE.sql"
gpg --batch --yes --encrypt --recipient "$GPG_RECIPIENT" \
  "$BACKUP_DIR/files-$DATE.tar.gz"

# 4. Suppression fichiers en clair
rm "$BACKUP_DIR/db-$DATE.sql" "$BACKUP_DIR/files-$DATE.tar.gz"

# 5. Upload S3 (rclone, BackBlaze B2, Wasabi - tarifs variables)
rclone copy "$BACKUP_DIR/" remote:woocommerce-backup/ --include "*$DATE*"

# 6. Rétention locale 7 jours
find "$BACKUP_DIR" -name "*.gpg" -mtime +7 -delete

echo "Backup OK: $DATE"
sudo chmod +x /usr/local/bin/backup-woo.sh
sudo crontab -e
# Ajouter :
0 3 * * * /usr/local/bin/backup-woo.sh >> /var/log/backup-woo.log 2>&1

Test de restore (à faire mensuellement, indispensable) :

# Sur serveur de test
gpg --decrypt db-2026-04-25-0300.sql.gpg > db.sql
sudo -u www-data wp --path=/var/www/boutique-test db import db.sql

9. Tests de la checklist

Script all-in-one audit-woo.sh :

#!/bin/bash
URL="https://boutique.ma-pme.sn"

echo "=== HSTS ==="
curl -sI "$URL" | grep -i "strict-transport"

echo "=== X-Frame-Options ==="
curl -sI "$URL" | grep -i "x-frame"

echo "=== XML-RPC ==="
curl -sI "$URL/xmlrpc.php" | head -1

echo "=== User enumeration ==="
curl -s "$URL/wp-json/wp/v2/users" | head -c 100

echo "=== Author enum ==="
curl -sI "$URL/?author=1" | head -1

echo "=== Plugin updates ==="
sudo -u www-data wp --path=/var/www/boutique plugin list --update=available

echo "=== Latest core ==="
sudo -u www-data wp --path=/var/www/boutique core check-update
chmod +x audit-woo.sh && ./audit-woo.sh

Les résultats attendus : HSTS présent, X-Frame OK, XML-RPC 403, REST users vide, author?=1 → 403, pas de plugin obsolète, core à jour.


10. Checklist 30 points résumée

INFRASTRUCTURE
[ ] 1. HTTPS Let's Encrypt + redirection 301
[ ] 2. HSTS preload activé
[ ] 3. Firewall UFW : 22/80/443 only
[ ] 4. SSH par clé uniquement, pas de root login
[ ] 5. fail2ban actif sur SSH + WordPress

WORDPRESS
[ ] 6. Core, plugins, thèmes à jour
[ ] 7. wp-config : DISALLOW_FILE_EDIT, FORCE_SSL_ADMIN
[ ] 8. Préfixe tables non-wp_
[ ] 9. Salts régénérées
[ ] 10. Permissions 640 wp-config, 644 fichiers, 755 dossiers
[ ] 11. Désactiver XML-RPC
[ ] 12. Désactiver REST users non authentifié
[ ] 13. Désactiver ?author= enumeration

AUTHENTIFICATION
[ ] 14. 2FA forcé pour tous les admins
[ ] 15. Mots de passe ≥ 16 chars (audit annuel)
[ ] 16. Limit login attempts (plugin ou fail2ban)
[ ] 17. Aucun user "admin" / "administrator" par défaut
[ ] 18. Sessions limitées dans le temps

WOOCOMMERCE
[ ] 19. Capture de carte via PSP (jamais sur le serveur)
[ ] 20. Mobile money via agrégateur (PayDunya/CinetPay/Wave)
[ ] 21. Webhooks signés HMAC vérifiés
[ ] 22. CSP autorisant uniquement le PSP
[ ] 23. Logs de transactions chiffrés

CONTENU & DONNÉES
[ ] 24. Backup quotidien chiffré + offsite
[ ] 25. Test de restore mensuel
[ ] 26. Conformité [cdp.sn](https://cdp.sn) (politique, registre, DPO)
[ ] 27. RGPD si clients UE (mentions, cookies)
[ ] 28. Logs de connexion conservés 6-12 mois

MONITORING
[ ] 29. Alerting (Wordfence Premium / Sucuri / monitoring custom)
[ ] 30. Audit pentest annuel (voir [pentesting éthique pour PME](/pentesting-ethique-pme-guide-complet/))

FAQ

Wordfence vs Sucuri vs solution maison ?

Wordfence : firewall + scan, gratuit suffisant pour la plupart des PME. Sucuri : WAF cloud + nettoyage en cas de hack, plus cher mais excellent SLA. Solution maison (nginx + fail2ban + monitoring custom) : plus de contrôle, demande de l’expertise. Pour une PME sans IT interne : Wordfence Premium est le meilleur ratio.

Comment savoir si la boutique a déjà été compromise ?

Indicateurs : trafic sortant inhabituel, fichiers récents dans wp-content/uploads/*.php, admins inconnus dans wp_users, requêtes SQL anormales. Commande rapide : find /var/www -name "*.php" -mtime -7 -ls liste les PHP modifiés dans les 7 derniers jours — toute exécution non documentée est suspecte.

Le HTTPS suffit-il à protéger les paiements ?

Non. HTTPS protège le transport seulement. La sécurité du paiement repose sur : (1) ne jamais stocker les données de carte (passer par un PSP type Stripe/PayDunya/CinetPay tokenisé), (2) signer les webhooks, (3) journaliser les transactions hors-site.

Comment auditer rapidement les plugins WordPress installés ?

sudo -u www-data wp plugin list --format=csv > plugins.csv
wpscan --url URL --api-token T --enumerate vp

Croiser avec wpvulnerability.com et patchstack.com pour les CVE récentes.

Est-il sécurisant de tout bloquer derrière Cloudflare ?

Cloudflare apporte un WAF, anti-DDoS, et masque l’IP origine. Mais : si un attaquant trouve l’IP d’origine (DNS history, certificats, fuites de logs), il peut contourner. Conséquence : firewaller le serveur pour n’accepter que les IPs de Cloudflare.

# Récupérer la liste IPs Cloudflare officielle
for ip in $(curl -s https://www.cloudflare.com/ips-v4/); do
  sudo ufw allow from $ip to any port 443
done
sudo ufw deny 443  # par défaut

Que faire si un client signale une fraude après commande ?

  1. Geler la commande (ne pas expédier)
  2. Vérifier les logs WP-CLI : wp action-scheduler list --search='order'
  3. Croiser IP commande avec base GeoIP (cohérent avec adresse livraison ?)
  4. Analyser les logs PSP (Stripe Radar, agrégateur mobile money)
  5. Documenter l’incident, signaler à la CDP si données personnelles compromises

Combien de temps pour appliquer cette checklist ?

Pour une boutique existante : 2-3 jours homme pour appliquer les 30 points. Le test de restore mensuel ajoute 2h/mois récurrentes. L’audit pentest annuel : externalisé voir pentesting éthique pour PME.

WP-CLI est-il indispensable ?

Pour ce niveau de sécurité, oui. WP-CLI permet d’auditer, mettre à jour, et restaurer en commande sans passer par l’admin (qui peut être compromis). Installation : curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && chmod +x wp-cli.phar && sudo mv wp-cli.phar /usr/local/bin/wp.


Articles liés (cluster Cybersécurité PME)

Voir aussi : WordPress PME Afrique : guide complet, Pentesting d’applications web : OWASP Top 10.


Article mis à jour le 25 avril 2026. Pour signaler une erreur ou suggérer une amélioration, écrivez-nous.

Besoin d'un site web ?

Confiez-nous la Création de Votre Site Web

Site vitrine, e-commerce ou application web — nous transformons votre vision en réalité digitale. Accompagnement personnalisé de A à Z.

À partir de 250.000 FCFA
Parlons de Votre Projet
Publicité