Google et visibilité · 8 min · publié le 17 novembre 2024 · mis à jour le 11 août 2025

Core Web Vitals effondrés : un mineur dans le navigateur

Un JavaScript de minage fait exploser l'INP et le TBT : le navigateur calcule pour quelqu'un d'autre. Les visiteurs chauffent, Google le mesure. Retirer le script recoller souvent les vitals — à condition que ce soit bien un mineur, pas un thème de 4 Mo.

Réponse directe

Un JS de minage fait exploser l'INP et le TBT. Les visiteurs chauffent, Google le mesure. Retirer le script suffit souvent à recoller les vitals.

core web vitals malware site lent google minage INP après hack

Lire INP, TBT, pas seulement le score

Un site « devenu lent » après un incident, avec un Lighthouse qui parle de Temporary Blocking Time et d'INP à 800 ms, ce n'est pas toujours « il faut un autre hébergeur ». Un mineur Monero (ou équivalent) tourne dans l'onglet. Le CPU grimpe, le téléphone chauffe, les Core Web Vitals plongent.

Le LCP peut aussi souffrir si le thread est saturé. Le CLS, moins. Un profil : INP/TBT absurdes, LCP moyen, images correctes. À l'inverse, un slider de 3 Mo sans malware casse le LCP sans chauffer autant.

Chrome : gestionnaire de tâches du navigateur, onglet qui mange 80 % CPU sur votre home. Ce n'est pas « le Wi-Fi ». C'est du JS. Le guide cryptominage pose le cadre métier.

Ouvrez le gestionnaire de tâches de Chrome sur la home, en navigation privée, bloqueurs coupés. Un onglet à 70–90 % CPU pendant que la page « ne fait rien », c'est le profil mineur. PageSpeed desktop peut rester poli si le script est mobile-only ou retardé. Croisez CrUX (Search Console) et un téléphone en 4G. Le guide cryptominage pose le cadre ; ici on cherche le fichier qui chauffe.

Reconnaître un mineur dans le HTML

Noms : `coinhive` (historique), `cryptonight`, `wasm`, `miner`, un WebSocket vers un pool, un `new Worker` qui calcule en boucle. Souvent obfusqué : une seule ligne `eval(atob(` dans `footer.php` ou un script chargé depuis un CDN inconnu (`jquery` qui n'est pas jQuery).

L'inspection d'URL et « afficher la source » déconnecté. Les extensions adblock masquent parfois le script chez vous, pas chez le client, pas chez PageSpeed. Testez sans bloqueur.

Un service worker pirate continue après le retrait du script dans le thème. Chrome DevTools > Application > Service Workers. Désenregistrez, retirez le fichier `sw.js` à la racine s'il n'est pas le vôtre.

Noms : cryptonight, wasm, miner, WebSocket vers un pool, `new Worker`. Souvent `eval(atob(` dans footer.php ou un « jquery » qui n'est pas jQuery. Les adblocks masquent chez vous, pas chez PageSpeed. Un service worker pirate survit au retrait du thème : DevTools > Application > SW, retirez un `sw.js` qui n'est pas le vôtre.

Où le script est accroché

`footer.php`, `header.php`, widget texte, `wp_options` (`insert_headers_footers`, thème mods). Google Tag Manager : ouvrez le conteneur et les versions, un tag que vous n'avez pas créé suffit. Un pixel « analytics » chargé depuis un domaine d'une lettre.

mu-plugins. `uploads` : `cache.js.php`, `load.php.jpg` inclus. `wp-config.php` rarement pour du JS, plus pour un include PHP qui print le script.

Les constructeurs : CSS/JS custom Elementor (Pro > Custom Code). Un add-on abandonné. Elementor.

GTM : tags et versions. Widgets, theme_mods, Custom Code Elementor. mu-plugins. `load.php.jpg` inclus. wp-config rarement pour du JS, plus pour un include PHP qui print le script.

  • Thème et custom code builder.
  • GTM / pixels.
  • mu-plugins et uploads.

Ce que PageSpeed voit et ce qu'il rate

PageSpeed charge souvent sans le cloaking « mobile only ». Un mineur qui ne part que sur téléphone échappera au labo desktop. Testez mobile, 4G, et CrUX (données terrain) dans Search Console : le terrain, c'est vos vrais visiteurs.

Un mineur qui attend 10 secondes après le load peut passer à côté d'un audit court. Le ressenti client, lui, est là. Fiez-vous au CPU et au HTML, pas seulement à la note 54.

Après le retrait : caches et workers

Purgez CDN, cache HTML, Redis. Un `autoptimize` / `wp-rocket` a pu concaténer le mineur dans un `cache/min/*.js`. Supprimez ce cache, pas seulement le fichier source.

Les headers `service-worker` et les anciens JS versionnés (`app.js?ver=1.0.0` resté au CDN) se servent encore. Changez le query string ou le nom après nettoyage.

Autoptimize / WP Rocket ont pu concaténer le mineur dans `cache/min/*.js`. On vide ce cache. Changez le query string des JS après clean : le CDN sert encore `app.js?ver=1.0.0`.

Minage vs pub vs thème lourd

Un tag pub mal configuré (refresh 2 s, 12 iframes) casse aussi l'INP. Ce n'est pas un incident de sécurité. Critère : script hors inventaire, pool, obfuscation, fichier que vous n'avez pas posé.

Un thème nulled « ultra » charge 40 sliders et un mineur. On retire les deux, on ne garde pas le thème. Thème nulled.

Search Console et le rapport Vitals

Le rapport Core Web Vitals est lissé sur 28 jours. Retirer le mineur aujourd'hui ne met pas le rapport au vert demain. Les rich results et le classement n'attendent pas ce vert pour autant — mais l'expérience réelle, si.

Ne « validez pas la correction » Vitals le soir même. Laissez du terrain propre s'accumuler. Ce n'est pas la file malware.

Fermer la porte, pas seulement le JS

Un mineur se réécrit. Même enquête que le reste : utilisateurs, extensions, File Manager, PHP uploads. WordPress, backdoor.

L'hébergeur a parfois suspendu pour CPU : le constat (script retiré, cron propre) sert au ticket. créer un espace si vous voulez ce constat.

Retirer le JS sans fermer l'entrée, c'est une semaine de vitals verts puis le retour. Users, File Manager, PHP uploads, thème. WordPress piraté, backdoor. Si l'hébergeur a coupé pour CPU, le chemin du script va dans le ticket. Créer un espace pour ce constat.

Questions fréquentes

Le site est lent mais je ne trouve pas de miner. Je change d'offre ?

+
Mesurez d'abord : TTFB (serveur) vs TBT (navigateur). Un TTFB à 3 s, c'est l'hébergement ou la base. Un TBT à 2 s, c'est le JS. Ne payez pas un VPS pour un script que vous n'avez pas retiré. TTFB haut = serveur ou base. TBT haut = JavaScript. Ne payez pas un VPS pour un script encore là.

Wordfence signale « miner » sur un fichier du cœur. Je répare ?

+
Comparez au zip officiel. « Réparer tout » casse parfois le thème enfant. Wordfence 80 fichiers.

Les vitals CrUX mettent combien de temps à remonter ?

+
Souvent 2 à 4 semaines de trafic propre. Le labo Lighthouse, lui, peut être vert le jour même après purge de cache. CrUX : souvent 2 à 4 semaines. Lighthouse peut être vert le jour même après purge.

Un mineur peut-il faire suspendre l'hébergeur ?

+
Oui, pour charge. Traitez la cause, joignez le chemin du fichier au ticket. Ne rouvrez pas à la main. Oui, pour charge. Joignez le chemin du fichier. Ne rouvrez pas à la main.

C'est lié à une alerte Chrome « site dangereux » ?

+
Pas toujours. Un mineur peut passer sous Safe Browsing un temps, et quand même tuer les vitals. Inversement, un phishing n'a pas besoin de miner. Un mineur peut passer sous Safe Browsing un temps. Un phishing n'a pas besoin de miner.
À lire ensuite
Cryptominage (guide) Rich results perdues WordPress piraté Wordfence a détecté Backdoor PHP Déclarer mon site