Quand on parle d’audit de sécurité WordPress, on pense souvent au thème, aux plugins, aux mots de passe, ou au pare-feu. Pourtant, la base de données reste le cœur de l’application. Si elle se dégrade, si les paramètres sont incohérents, ou si certaines données sont anormalement volumineuses, l’impact se voit vite: lenteurs, pages qui expirent, connexions bloquées, et parfois des comportements “bizarres” qui ressemblent à une faille. Un audit sérieux commence donc par la santé de la base.
L’objectif n’est pas seulement de “voir si tout marche”. Il s’agit de vérifier que la base est saine, qu’elle correspond aux exigences de WordPress, qu’elle n’a pas dérivé au fil des installations et migrations, et qu’elle ne facilite pas des attaques classiques (mauvaise gestion des droits, exposition d’informations, traces laissées par des tentatives, ou contenu compromis stocké dans des tables).
Pourquoi la base de données est un sujet de sécurité, pas seulement de performance
WordPress stocke énormément de choses en base: contenus (articles, pages), configuration (options), états de publication, utilisateurs et rôles, méta données, commentaires, transients, réécritures, et même des résidus d’extensions passées. Une base “sale” n’est pas seulement un problème de vitesse. Elle crée des conditions propices aux incidents.
J’ai déjà vu des cas où la base semblait intacte, mais où un plugin expiré laissait des options massives dans wp_options avec autoload activé. Résultat: chaque chargement déclenchait des lectures inutiles, ce qui augmentait la charge sur le serveur SQL et augmentait les délais. Sur un site exposé, cette latence a facilité des tentatives répétées de type bruteforce, parce que les réponses étaient lentes, les sessions instables, et la surveillance “classique” moins réactive.
De l’autre côté, une base correctement configurée, avec des tables cohérentes, des encodages maîtrisés, des privilèges limités, et un historique de sauvegardes exploitable, rend l’attaque plus difficile et la récupération plus rapide.
Ce que “vérifier la santé” signifie concrètement
Dans un audit et sécurisation WordPress, “la santé” de la base recouvre plusieurs axes:
- cohérence technique (moteur de stockage, encodage, structure, index, fragmentation) intégrité (telles erreurs qui apparaissent dans les logs, cohérence entre tables liées) sécurité applicative (contenu et métadonnées suspectes, options à risque, utilisateurs et rôles) exposition et contrôle d’accès (droits SQL, comptes, configuration d’accès) capacité de restauration (sauvegardes, tests de restauration, restauration cohérente)
On peut passer beaucoup de temps à “scanner”, mais si on oublie le minimum utile (données sensibles, droits, et capacité de restauration), l’audit perd son sens opérationnel.
Étape 1: dresser un inventaire de la base (sans se tromper d’instance)
Avant de lancer des requêtes, la première erreur fréquente est de contrôler la mauvaise base. Dans les environnements hébergés, on peut avoir plusieurs bases par site, une base de staging, une base pour le multisit e, ou des versions de travail qui ne correspondent pas à ce que le trafic utilise.
Commencez par identifier:
- le schéma réellement utilisé par WordPress (souvent via DB_NAME dans wp-config.php) le préfixe des tables ($table_prefix) le moteur et la version SQL (utile pour interpréter les alertes et la compatibilité) si le site est en multisite (les tables peuvent être nombreuses et la logique différente)
Même si cela paraît administratif, c’est essentiel: une requête de vérification d’intégrité ou une analyse d’options à risque sur la mauvaise base peut faire perdre plusieurs heures, et au final vous donner une “conclusion” qui ne correspond pas au site.
Étape 2: analyser l’espace et la croissance des tables (et repérer les anomalies)
Une base “en bonne santé” n’est pas forcément petite. Mais elle doit avoir une croissance cohérente et compréhensible. En audit sécurité, je regarde surtout les tables qui peuvent grossir anormalement et celles qui contiennent des données sensibles.
Les requêtes de volume peuvent être faites via l’interface MySQL/MariaDB, ou via SQL si vous avez un accès. L’idée est de repérer:
- des tables démesurées par rapport au reste des tables qui grossissent vite après certaines mises à jour des résidus d’extensions (transients non nettoyés, options orphelines, méta post gigantesque)
Un signe classique est la taille de wp_postmeta qui devient massive, souvent à cause d’un plugin qui stocke trop de métadonnées ou à cause d’imports répétés. Une table énorme n’est pas “une preuve” de compromis, mais elle complique la détection, la rotation des clés, et les opérations de maintenance. Sur un site attaqué, les attaquants peuvent aussi injecter du contenu et multiplier les entrées. Si vous constatez une divergence brutale du volume avant/après un événement (migration, mise à jour, incident), c’est un signal fort.
Le détail utile sur autoload dans wp_options
Dans wp_options, deux colonnes attirent l’attention en audit: autoload et les tailles. Beaucoup d’options marquées autoload='yes' sont chargées à chaque requête. Un site peut fonctionner longtemps, puis devenir instable quand le volume d’options augmente.
L’approche “saine” consiste à:
- repérer les options volumineuses (souvent via taille des valeurs) vérifier si elles sont liées à un plugin actif ou à un composant abandonné évaluer l’impact d’un changement d’autoload (c’est souvent faisable, mais il faut comprendre les effets sur le fonctionnement)
Il y a un piège: si vous corrigez au hasard, vous pouvez casser des comportements attendus. Par exemple, certaines options sont conçues pour être chargées dès le bootstrap. Le bon réflexe est de rapprocher l’option suspecte de son usage dans WordPress ou dans le plugin concerné.
Étape 3: vérifier l’intégrité structurelle (charset, collation, moteurs)
La structure dit déjà beaucoup. Je commence par les éléments qui causent des bugs silencieux:

- encodage et collation des tables (UTF-8 attendu, sans mélange incohérent) moteur de stockage des tables (souvent InnoDB, mais vérifiez la cohérence) présence d’index anormaux ou manquants pour les colonnes utilisées par WordPress
Des problèmes d’encodage peuvent se manifester par des contenus “cassés” ou des caractères inattendus. Un attaquant peut aussi exploiter des incohérences de traitement pour provoquer des erreurs, contaminer des données, ou rendre la détection plus difficile.
Côté moteur, la plupart des sites modernes sont en InnoDB, mais ce n’est pas une garantie universelle. Si vous voyez des moteurs différents sur des tables critiques, c’est un point à investiguer, surtout après une migration.
Étape 4: regarder les connexions, les erreurs et les temps de réponse de MySQL
La sécurité ne se limite pas aux requêtes suspectes. Une base instable devient une porte d’entrée indirecte. En audit, je vérifie:
- les erreurs répétées dans les logs SQL (chutes, timeouts, erreurs de verrouillage) les pics de connexions des indicateurs de verrouillage ou de lenteur (souvent visibles via tables de monitoring ou performance schema, selon votre hébergement)
Si vous avez accès au slow query log ou à des outils de performance, examinez les requêtes récurrentes. Souvent, les requêtes lentes proviennent de:
- un plugin mal conçu des jointures coûteuses l’absence d’index adaptés ou une dérive dans la taille des tables (metadata massive, transients non gérés)
Attention au trade-off: ajouter des index ou modifier des requêtes peut améliorer les performances, mais cela modifie aussi la logique de l’application et peut avoir un impact sur la latence. En contexte de sécurité, vous voulez des changements maîtrisés et réversibles.
Étape 5: contrôler les tables et contenus qui peuvent porter des “preuves” d’incident
Ici, on passe du technique au sécurité. WordPress stocke les traces dans plusieurs endroits, et ce sont des zones utiles pour comprendre si un incident a eu lieu.
Je me concentre sur trois familles:
Utilisateurs et rôles Options et configuration Contenu injecté ou altéré via posts, pages, commentaires, et métaUtilisateurs: repérer les comptes anormaux
Une base de données saine doit refléter la réalité du site. En audit, je vérifie les champs associés aux utilisateurs: rôles, dates de dernière connexion (quand disponibles), activité, et cohérence. Les comptes créés “en douce” sont fréquents. Ce n’est pas toujours une preuve de compromission, mais c’est un point de départ.
Le cas typique: un compte administrateur a été créé, parfois avec un identifiant qui ressemble à un humain, mais avec un mot de passe inconnu de l’équipe. Si la base a aussi des anomalies dans wp_usermeta, cela devient beaucoup plus crédible.
Options: les valeurs à surveiller (et celles à ne pas toucher)
wp_options peut contenir des informations sensibles, mais aussi des données volumineuses. Tous les éléments ne se valent pas. Certains changent naturellement au fil des mises à jour. D’autres sont plus “bizarres” dans une installation standard.
En pratique, j’évalue:
- les options liés à des mises en place de sécurité les options qui contiennent des URLs externes ou des chemins inattendus les options dont les valeurs semblent incohérentes (formats inattendus, présence de chaînes qui ressemblent à du code, ou références à des composants disparus) les options volumineuses avec autoload activé, car elles aggravent aussi l’empreinte de l’anomalie
Le point clé: avant d’effacer quoi que ce soit, je rapproche l’option du plugin ou du composant qui pourrait l’avoir créée. Supprimer aveuglément peut provoquer un dysfonctionnement et, pire, effacer une trace utile pour l’analyse.
La validation la plus sous-estimée: savoir restaurer
Un audit sécurité a peu de valeur si vous ne pouvez pas revenir à un état stable. Une base de données “saine” c’est aussi une base dont les sauvegardes sont utilisables.

Dans mes audits, je demande toujours un minimum de preuve opérationnelle:
- qu’il existe des sauvegardes cohérentes (fichiers et base, idéalement assorties d’un horodatage clair) qu’on peut restaurer dans un environnement de test qu’on peut vérifier que WordPress remonte correctement et que le contenu correspond
Ce n’est pas spectaculaire, mais c’est déterminant. Un incident de base peut nécessiter une restauration rapide, et si l’équipe n’a jamais testé, la première restauration devient un exercice de dépannage en direct.
Voici un cadre de contrôle simple, réalisable sans outillage exotique.
- Vérifier que les sauvegardes de base incluent bien toutes les tables du schéma utilisé par WordPress. Tester une restauration sur staging ou un environnement isolé, puis vérifier pages, login et plugins critiques. Comparer le contenu et les versions attendues (thème, plugins, numéro de version WordPress) avec l’état avant incident. Confirmer que les sauvegardes contiennent bien les informations nécessaires à la reprise (config, si pertinent, ou au moins la cohérence base).
(Quatre points, mais c’est souvent ce qui fait la différence entre une bonne analyse et une vraie capacité de réponse.)
Étape 6: droits SQL et comptes de base (le contrôle d’accès au niveau base)
Le contrôle d’accès est une barrière. Si WordPress utilise un compte SQL surpuissant, un incident côté application se propage plus facilement.
En audit, je vérifie:
- quels droits SQL sont accordés au compte configuré dans wp-config.php si ce compte a des privilèges inutiles (drop, alter au-delà du nécessaire, ou droits plus larges que requis) la cohérence entre l’hôte, le compte, et le périmètre autorisé
Le bon niveau de privilèges dépend de votre hébergement. Sur certains plans mutualisés, la granularité est limitée. Mais la logique reste la même: plus vous limitez les droits de la connexion WordPress vers le serveur SQL, plus vous réduisez l’impact d’une compromission applicative.
Trade-off à connaître: des droits trop restreints peuvent casser l’administration (mises à jour, réparation, import). Il faut donc viser le “juste assez” et valider sur staging.
Étape 7: repérer le “bruit” généré par les attaquants, sans tomber dans le théâtre
Les attaquants laissent parfois des traces dans la base: contenu modifié, options modifiées, utilisateurs ajoutés, ou commentaires spam.
Mais il y a aussi beaucoup de faux positifs. Par exemple:
- des plugins légitimes ajoutent des options que vous pourriez interpréter comme suspectes des campagnes de spam créent des commentaires et des méta liées, même sans compromission réelle des tâches planifiées créent des transients temporaires qui peuvent sembler “anormaux” si vous comparez un instant T à une référence ancienne
Dans un audit, j’aime travailler par comparaison temporelle. Au lieu de chercher “une table suspecte” seule, https://gardewp.fr/securite-wordpress/ je compare l’état avant et après un événement connu (migration, update, incident signalé). Si une anomalie apparaît exactement au moment où un compte a été verrouillé ou où le site a commencé à répondre lentement, l’hypothèse prend de l’épaisseur.
Une mini-grille de décision pour prioriser
Quand on a identifié des anomalies, il faut trier. Voici une grille pratique, sans prétendre que tout est binaire.
| Signal observé dans la base | Ce que ça suggère souvent | Priorité d’action | |---|---|---| | Pic de volume brutal sur wp_postmeta ou wp_options | Plugin, import, ou dérive applicative | Haute si corrélé à un incident | | wp_options avec beaucoup de valeurs volumineuses en autoload=yes | Charge inutile, surface d’attaque indirecte via instabilité | Moyenne à haute | | Nouveaux utilisateurs admin, rôles inattendus | Compromission applicative possible | Très haute | | Erreurs SQL répétées (verrouillages, timeouts) | Instabilité qui favorise les contournements et complique la réponse | Haute | | Encodage/collation incohérents entre tables | Migrations bancales, risques de contenus corrompus | Moyenne |
Cette grille ne remplace pas l’analyse, mais elle vous évite de traiter tout comme une urgence.
Sécurisation orientée base: quoi changer, quoi éviter
À ce stade, vous avez des constats. La tentation est de “nettoyer” et “durcir” immédiatement. C’est parfois la bonne décision, mais pas toujours.
Par expérience, je distingue deux catégories de mesures:
- celles qui réduisent le risque sans casser l’application celles qui améliorent les performances mais demandent une validation
Par exemple, changer la structure des données en profondeur (requêtes de purge, modifications de schéma, suppression d’entrées) peut être nécessaire, mais doit être fait avec une stratégie de restauration claire. Si vous modifiez le contenu d’options ou de méta, vous voulez une méthode pour revenir en arrière en cas d’effet de bord.
Le plus prudent est de commencer par:
- identifier le plugin ou le composant à l’origine d’une dérive corriger la cause (désactiver le plugin problématique, corriger une config) puis seulement ensuite optimiser la base
Dans les audits que j’ai conduits, le pire scénario arrive quand on supprime des données suspectes sans comprendre leur origine, puis que l’administrateur perd une fonctionnalité ou pire, déclenche une autre cascade d’erreurs. La sécurité, ici, se joue sur la méthode.
Les pièges courants lors de l’audit de base de données
Il y a quelques erreurs qui reviennent souvent, même chez des équipes motivées:
- confondre une base “pleine” avec une base “compromise”. La croissance peut être légitime, import, évolution du site, ou simple usage normal de méta. corriger la taille ou l’autoload sans comprendre pourquoi les options ont été créées. négliger la partie restauration. Une base “saine” sur le papier, mais impossible à restaurer dans un délai raisonnable, ne protège pas. chercher uniquement des indicateurs “visibles”. Parfois, l’incident est plus subtil, et se manifeste par des comportements applicatifs, pas par une table immédiatement “malveillante”.
L’audit gagne en qualité quand vous reliez toujours la base aux symptômes observés sur le site.
Ce que vous devez produire à la fin de l’audit
Un audit utile se traduit en décisions. Pour la partie base de données, je recommande de documenter:
- l’état des tables clés et les anomalies repérées (taille, index, encodage, moteurs) les options et comportements qui augmentent la charge ou semblent incohérents les comptes SQL et les droits utilisés par WordPress les corrélations temporelles avec un incident ou une modification la stratégie de restauration testée, ou à défaut, un plan de test
Ce dossier devient la base des prochaines actions, que ce soit pour corriger un plugin, réduire la charge, ou investiguer plus loin si une compromission est plausible.
Mettre l’audit en pratique sur un site réel: un exemple de démarche
Sur un site vitrine avec une forte activité de formulaires, on a constaté des ralentissements intermittents. Les logs applicatifs mentionnaient des timeouts, et côté serveur web on voyait des pics de trafic non négligeables, possiblement liés à du spam.
En inspectant la base, on a trouvé une dérive sur wp_options avec beaucoup d’entrées associées à un plugin d’automatisation. Certaines avaient autoload=yes, ce qui multipliait les lectures à chaque chargement. Le site n’était pas “piraté” au sens classique, mais l’instabilité rendait l’attaque plus facile: les requêtes finissaient par dépasser des seuils, et les sessions devenaient plus difficiles à gérer.
Le correctif a été progressif: on a identifié l’origine dans le plugin, on a désactivé le comportement problématique en premier, puis seulement après on a nettoyé et revalidé la stabilité. Résultat: baisse nette de la charge SQL, réduction des erreurs et amélioration de la capacité de réponse en cas d’attaque de type brute ou spam.
Ce genre de cas illustre une idée importante: la sécurité passe aussi par le fait de réduire les conditions qui favorisent les attaques, même si la base n’est pas “infectée”.
Où aller ensuite
Une fois la base évaluée, l’audit et sécurisation WordPress peut basculer vers d’autres axes complémentaires: vérification des plugins et des thèmes (versions, cohérence, fichiers présents), durcissement applicatif, rotation de secrets, et revue des journaux côté serveur.
Mais en pratique, si la base est saine, documentée et restaurable, vous gagnez du temps partout ailleurs. Et surtout, vous évitez les “fausses victoires” qui consistent à patcher des symptômes sans avoir compris la mécanique.
Vérifier la santé de la base de données, c’est donc faire de la sécurité une discipline pragmatique. Vous partez des faits, vous évitez les décisions impulsives, et vous construisez un socle sur lequel on peut répondre vite quand quelque chose dérape.