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.
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.
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.