Skip to main content
Blog
Blog

Qu'est-ce que la sécurité CSS ? | Prévenir le phishing et le clickjacking liés aux attaques CSS

CSS contrôle ce que voient les utilisateurs. Les attaquants en tirent parti. Cet article explore les vulnérabilités côté client liées au CSS et comment s'en protéger.

Dec 23, 2025 15 min read
qu'est-ce que la sécurité css - cside

La confiance des utilisateurs est visuelle. Les utilisateurs ne peuvent faire confiance qu'à ce qu'ils voient. C'est le navigateur qui tient cette promesse visuellement. C'est le CSS qui délivre cette promesse visuelle. Le CSS va bien au-delà du simple habillage pour rendre les pages attrayantes et mettre votre marque en valeur.

Le CSS délivre l'interface utilisateur : ce que les utilisateurs peuvent voir et ce qu'ils ne peuvent pas voir. Si vous ne voyez pas de popup d'avertissement, pourquoi vous inquiéteriez-vous ? Lorsque des attaquants contrôlent ce qui s'affiche dans les navigateurs, ils contrôlent la confiance des utilisateurs. Ils peuvent les induire en erreur en injectant du CSS malveillant. C'est pourquoi le CSS constitue également une surface d'attaque cachée.

En mars 2025, 150 000 sites web l'ont appris à leurs dépens. Des visiteurs s'attendant à accéder à des sites légitimes ont atterri sur des plateformes de jeux d'argent chinoises. Comment ? Les attaquants ont injecté du JavaScript malveillant et utilisé des superpositions CSS pour remplacer les vraies pages.

« Chaque feuille de style est un canal potentiel par lequel le navigateur demande des ressources externes. Les feuilles de style CSS font donc partie de la posture globale de sécurité côté client. »

En résumé

  • Pourquoi le CSS est un risque de sécurité : Le CSS contrôle ce que voient les utilisateurs. Si des attaquants trouvent un point d'entrée, ils peuvent superposer une fausse interface pour mener des attaques de phishing en plusieurs étapes.
  • Comment fonctionnent les attaques basées sur le CSS : D'abord, les attaquants obtiennent un chemin d'injection (souvent via XSS ou des scripts tiers). Ensuite, le CSS peut être utilisé pour masquer des alertes, repositionner des éléments, réordonner du contenu ou empiler des superpositions invisibles pour du clickjacking et du phishing.
  • Conseils pour prévenir les abus CSS : Verrouillez les sources de styles avec la CSP, protégez les ressources statiques avec la SRI, bloquez l'intégration en iframe et renforcez la protection contre les vulnérabilités XSS. Vous pouvez également utiliser un outil de surveillance continue comme cside pour surveiller les changements du DOM.

Qu'est-ce que le CSS ?

HTML, CSS et JavaScript : qui fait quoi ?

Le CSS, abréviation de Cascading Style Sheets (feuilles de style en cascade), définit l'apparence de vos pages web. Il contrôle la couche visuelle : bordures, alignement, couleurs, polices, espacement, taille et bien d'autres propriétés de style.

Il fonctionne en harmonie avec le HTML qui donne la structure et le contenu à la page, ainsi qu'avec JavaScript qui gère le comportement et la logique : traitement des clics, affichage des messages d'erreur, envoi ou récupération de données depuis un serveur. Par exemple, le HTML définit <form>, <button> ou <input>, le CSS choisit les couleurs, les mises en page et la police, et JavaScript ajoute des propriétés dynamiques ainsi que la validation ou l'API de la requête.

Pourquoi le CSS est important pour la sécurité web

<compare-table data='{ "head_class": "!font-normal !bg-white", "cols": { "css": { "title": "Capacités CSS" }, "browser": { "title": "Comportement du navigateur" }, "attack": { "title": "Attaque et impact" } }, "rows": [ { "css": "url() dans background-image, @font-face, icônes", "browser": "Demande des ressources externes (polices, images, icônes)", "attack": "L'attaquant modifie les feuilles de style ou les URL des ressources" }, { "css": "display: none; visibility: hidden; contenu hors écran", "browser": "Affiche ce qui est visible ou caché, à l'écran ou hors écran", "attack": "Interface manipulée : avertissements masqués, bannières de consentement minimisées, boutons déplacés" }, { "css": "Restyliser boutons, formulaires, bannières", "browser": "Applique des styles aux nœuds DOM créés par HTML/JS", "attack": "L'attaquant injecte du HTML/JS (XSS, ressources compromises)" }, { "css": "Superpositions, couches placées au-dessus", "browser": "Donne au contenu injecté un aspect « natif » s'il correspond au CSS existant", "attack": "Le CSS existant rend le DOM malveillant normal et digne de confiance" } ] }'

Voici pourquoi les praticiens de la sécurité doivent y prêter attention : HTML, JavaScript et CSS s'exécutent dans le navigateur et partagent la même origine et les mêmes limites de confiance. Le Document Object Model (DOM) est central ici. Lorsqu'une page se charge, le navigateur analyse le HTML en arbre DOM et le CSS en CSS Object Model (CSSOM). Le résultat est un Render Tree qui ne contient que les éléments visibles et stylisés.

JavaScript est conçu pour lire et manipuler le DOM : il peut ajouter, modifier, supprimer et masquer des éléments à l'exécution.

Tout ce qui peut modifier le DOM, comme du HTML ou du JavaScript injecté, peut modifier l'interface et ce qui s'affiche à l'écran de l'utilisateur. Cela crée à la fois des opportunités et des risques.

C'est pourquoi la sécurité CSS doit commencer par la prévention de la manipulation du DOM : prévention XSS, CSP et sécurité de la chaîne d'approvisionnement.

Le CSS : du design visuel à la surface d'attaque

Contrairement à JavaScript, le CSS ne peut pas exécuter de code, mais il peut demander au navigateur de charger des ressources supplémentaires telles que des polices, des images ou des icônes depuis des serveurs externes. Par exemple, les valeurs url() en CSS dans background-image ou @font-face peuvent indiquer au navigateur d'aller chercher ces ressources sur des serveurs externes.

Chaque feuille de style est un canal potentiel par lequel le navigateur demande des ressources externes, et fait donc partie de la posture globale de sécurité côté client.

Même sans exécuter de code, le CSS décide de ce qui s'affiche et de ce qui reste caché avec display:none; ou visibility:hidden;. Il peut également repositionner du contenu hors écran, de sorte que les utilisateurs ne voient même pas certaines options ou boutons. Il peut déplacer et restyliser des boutons et des formulaires, masquer ou minimiser visuellement des avertissements et des bannières de consentement, ou même ajouter des couches qui modifient la façon dont les utilisateurs interagissent avec la page.

Si des attaquants peuvent modifier les feuilles de style chargées ou les images, polices ou icônes qu'elles référencent, ils peuvent influencer ce que voient les utilisateurs.

C'est ainsi que le CSS devient une partie de votre surface d'attaque CSS et de votre surface d'attaque côté client plus large, et pourquoi il doit être inclus dans votre gestion et évaluation des risques. Après une vulnérabilité d'injection, comme le cross-site scripting, des acteurs malveillants peuvent transformer le CSS en arme.

Comment le CSS incite les utilisateurs à vous faire confiance

Les utilisateurs font confiance à ce qu'ils voient si l'interface se comporte comme ils s'y attendent. Si l'interface leur est familière, ils font confiance au processus.

Cela fait de la hiérarchie visuelle une préoccupation de design UX. Mais cela devient une préoccupation de sécurité lorsque des attaquants manipulent un design de confiance. Par exemple, vous concevez votre bouton « Payer maintenant » pour qu'il soit bien visible, avec des messages d'erreur clairs pour les rendre évidents et lisibles, pas difficiles à trouver ou faciles à manquer.

L'inverse est également vrai. Une mise en page confuse entraîne des clics involontaires ou des actions irréversibles sans avertissement, et la confiance s'effondre. Un CSS soigné et un design UI réfléchi doivent éviter les mises en page déroutantes et réduire les clics involontaires. Ils doivent fournir un retour sans ambiguïté et donner des repères visuels clairs sur ce qui se passe et ce qu'on attend des utilisateurs.

Un UX « sécurisé par conception » utilise le CSS pour aider les clients à naviguer en toute confiance dans vos applications. Si les utilisateurs sont confus et ne comprennent pas ce qui se passe ou pourquoi, vos contrôles de sécurité ne portent pas leurs fruits.

Les utilisateurs font confiance aux schémas familiers et les attaquants le savent : ils injectent du CSS, repositionnent un bouton de paiement, masquent un avertissement et superposent un faux formulaire de paiement.

Comment le CSS est utilisé dans les attaques de clickjacking

comment les utilisateurs sont trompés dans les attaques de clickjacking

De plus, les marges négatives peuvent pousser des éléments hors de l'écran. Un avertissement de sécurité peut être repoussé hors de la zone visible avec .security-warning { margin-top: -9999px; }.

D'autres astuces permettent de manipuler ce que voient les utilisateurs :

  • display: none supprime le contenu
  • visibility: hidden masque le contenu tout en préservant son espace
  • overflow: hidden coupe le contenu qui peut contenir des avertissements
  • overflow: visible étend le contenu en dehors de son conteneur en superposant d'autres éléments

Pour les flux critiques tels que la connexion, le consentement ou le paiement, il est nécessaire de vérifier la taille des éléments dans le DOM et si quelque chose est empilé dessus ou repoussé hors de la vue.

Points d'entrée des attaques CSS : XSS, CDN, chaîne d'approvisionnement et widgets

Dans la plupart des cas, les attaquants ont d'abord besoin d'un point d'entrée. Voici comment ils introduisent du CSS malveillant sur votre page :

  • Vulnérabilité XSS — Injection de balises <style> ou de styles inline
  • CDN compromis — CSS malveillant servi depuis une source de confiance
  • Attaque de la chaîne d'approvisionnement — Package npm, thème ou plugin compromis
  • Widgets tiers — Outils de chat, d'analytics, de tests A/B avec contrôle de la mise en page

Ces attaques ciblent le navigateur de l'utilisateur de différentes manières.

Le XSS et les widgets tiers injectent du CSS malveillant directement dans la page pendant son exécution dans le navigateur de l'utilisateur.

Les attaques CDN et de la chaîne d'approvisionnement empoisonnent le CSS à la source. Les attaques CDN remplacent votre CSS par des versions malveillantes sur le serveur. Les attaques de la chaîne d'approvisionnement introduisent subrepticement du CSS malveillant dans votre base de code lors de la compilation via un package npm ou des thèmes compromis.

Tromperie de l'interface dans les attaques par encadrement

Certaines attaques d'interface, comme le clickjacking par encadrement, n'ont pas besoin de modifier votre CSS du tout. L'attaquant attire plutôt l'utilisateur sur sa propre page. Il intègre votre site dans un iframe et déguise visuellement ce sur quoi l'utilisateur clique (UI redressing). Cela ne fonctionne que si votre site peut être intégré dans des iframes, c'est-à-dire sans restriction CSP frame-ancestors et sans en-tête X-Frame-Options.

Clickjacking SVG

Le clickjacking par encadrement peut aller bien au-delà du clic classique sur un bouton caché. En décembre, la chercheuse en sécurité Lyra Rebane a partagé une preuve de concept qui le démontre. Au lieu de s'appuyer sur des superpositions classiques, elle fait astucieusement fonctionner ensemble les filtres SVG et le rendu CSS d'une manière totalement nouvelle pour créer une attaque de clickjacking interactive et en plusieurs étapes. Les implications sont sérieuses : si les iframes intégrés sont autorisés, une telle attaque peut divulguer des données cross-origin, comme cela a été démontré avec le contenu de Google Docs. Conclusion : si vos pages peuvent être encadrées, supposez que des attaquants les ont déjà repérées.

Recherches indépendantes qui approfondissent le clickjacking SVG :

Comment rendre le CSS plus sûr : prévenir, détecter, défendre

Le CSS ne peut pas être utilisé comme arme seul. Les attaquants ont d'abord besoin d'un point d'entrée. Une fois cette tête de pont établie, le CSS devient un amplificateur. La sécurité CSS nécessite une défense en couches, avec une attention particulière portée aux scénarios qui offrent aux attaquants le plus de levier pour le moins d'effort (notamment les flux de connexion, de consentement et de paiement).

Une approche pratique empêche les styles malveillants de se charger dans le navigateur, détecte la manipulation visuelle et défend les utilisateurs et les systèmes pour limiter l'impact.

Comment prévenir les attaques basées sur le CSS

Pour prévenir les attaques CSS, bloquez-les dès l'entrée. Si vous empêchez l'injection inline et les styles non fiables de se charger dans le navigateur, les attaquants ne peuvent pas manipuler votre interface.

Les mesures suivantes rendront les abus CSS bien plus difficiles.

1 - Contrôler les sources de chargement des styles avec la Content Security Policy (CSP)

Utilisez style-src 'self' pour n'autoriser que les styles provenant de votre domaine. Bien sûr, évitez autant que possible style-src 'unsafe-inline' car ce paramètre autorise précisément les styles injectés. Si vous avez quand même besoin de styles inline, il est judicieux d'utiliser des nonces ou des hashes.

Ne laissez pas la peur de casser des fonctionnalités vous freiner. Vous pouvez tester votre CSP en toute sécurité avant le déploiement avec CSP Report-Only.

Les rapports CSP vous montrent ce qui serait bloqué. Ils listent les styles inline et les sources externes qui seront bloqués, ainsi que les dépendances tierces que vous avez peut-être oubliées. Corrigez-les, puis appliquez la politique.

2 - Épingler le CSS tiers avec la Subresource Integrity (SRI)

Pour empêcher le chargement de fichiers altérés, ajoutez la SRI (integrity + crossorigin) pour les feuilles de style hébergées sur CDN.

Par exemple :

<link rel="stylesheet" href="https://cdn.example.com/style.css"

integrity="sha384-..." crossorigin="anonymous">

Cela fonctionne mieux pour les ressources stables et versionnées, car chaque fois que le CDN met à jour ce fichier, le hash change. En conséquence, votre vérification SRI échouera et le navigateur le bloquera. Cela signifie que vous devrez mettre à jour manuellement le hash d'intégrité. Pour les CSS critiques qui changent souvent, il vaut mieux les héberger vous-même.

La Subresource Integrity est une mesure de défense solide pour les fichiers statiques. Les fichiers dynamiques tels que le JavaScript provenant de scripts tiers nécessiteront une solution de surveillance continue.

3 - Bloquer l'intégration en iframe avec des en-têtes anti-encadrement

Un autre problème majeur est celui des attaques classiques de clickjacking qui intègrent votre site dans un iframe invisible sur une page frauduleuse. Content-Security-Policy: frame-ancestors 'none' et X-Frame-Options: DENY empêchent les attaquants d'intégrer ou de superposer de faux éléments d'interface, et par conséquent, de tromper les utilisateurs pour qu'ils cliquent sur des boutons dont ils ne sont même pas conscients.

4 - Prévention XSS = sécurité CSS

Les styles inline augmentent le risque et compliquent l'application de la CSP. La façon dont vous prévenez le Cross-Site Scripting (XSS) définit en grande partie votre sécurité CSS. La plupart des abus CSS dépendent d'un chemin d'injection (souvent XSS). Si vous prévenez le XSS, l'attaque ne pourra pas injecter de blocs <style> ni d'attributs style="" inline.

Les contrôles préventifs comme la CSP, la SRI et le renforcement contre le XSS réduisent le risque, mais ils ne donnent pas de visibilité sur ce qui s'affiche réellement pour les utilisateurs. cside offre aux équipes de sécurité et de conformité une visibilité continue au niveau de la page sur les changements de style et de mise en page côté client.

Comment détecter les attaques CSS : surveiller les interfaces critiques

La prévention seule ne suffit pas. Mais on ne peut pas corriger ce qu'on ne voit pas. Si une attaque passe à travers les mesures préventives, la détection la repère tôt. Demandez-vous donc où la manipulation de l'interface aurait le plus d'impact sur la sécurité et quels signaux d'alarme surveiller.

La falsification CSS se manifeste le plus probablement sur les interfaces critiques. Il est judicieux de configurer des alertes automatiques pour les pages de connexion, de paiement et de confidentialité/consentement.

1. Détection manuelle du CSS malveillant

Maintenant que vous avez déterminé où chercher, surveillez les feuilles de style inconnues qui apparaissent de nulle part et vérifiez les signaux d'alarme et les schémas suspects :

  • les z-index extrêmes indiquent des attaques par superposition : z-index: 9999
  • les marges négatives importantes pour masquer du contenu hors écran : margin: -9999px
  • les messages de sécurité masqués avec display: none et visibility: hidden sur les avertissements, bannières de consentement ou messages d'erreur
  • la réorganisation visuelle pour enfouir des informations critiques sous la ligne de flottaison avec Flexbox order: 999
  • la taille de police minuscule ou le faible contraste pour limiter la visibilité des boutons « Annuler/Refuser » : font-size: 6px

Les vérifications de sécurité manuelles peuvent fonctionner pour des projets limités et de petite taille ; utilisez les DevTools pour repérer les signaux d'alarme sur vos pages de connexion, de paiement et de consentement. Avant la mise en production, testez sur mobile car il est plus facile pour les attaquants de masquer du contenu sur un petit écran.

2. Détection automatisée du CSS malveillant

Pour les projets grands et complexes, les vérifications manuelles ne passent pas à l'échelle. Intégrez plutôt la détection automatique dans votre système de surveillance de sécurité :

  • Surveillance de sécurité côté client en temps réel : cside détecte en continu les manipulations du DOM et de JavaScript en temps réel et envoie une alerte lorsque des éléments critiques sont altérés.
  • Rapports de violations CSP : ajoutez report-uri (ou report-to) à votre CSP pour que les navigateurs signalent automatiquement les violations de politique. Exécutez également un validateur CSP à chaque compilation pour détecter les mauvaises configurations.
  • Surveillance synthétique sur les pages clés : les outils de régression visuelle détectent les changements inattendus de l'interface en comparant des captures d'écran. Si un bouton de paiement rétrécit ou qu'un avertissement disparaît, vous le saurez avant vos utilisateurs.
  • Scanners de styles inline : configurez votre pipeline CI/CD pour analyser les styles inline sur les pages critiques et bloquer les commits avant qu'ils n'atteignent la production.

Risques de sécurité du CSS généré par vibe coding

Les outils de codage IA accélèrent le développement web et produisent des styles CSS en quelques secondes. Mais il y a un compromis : si les équipes acceptent le CSS généré sans revue de sécurité, elles risquent également d'accélérer l'introduction de vulnérabilités.

L'utilisation de styles inline présente le risque de contournement de la CSP ; les liens non contrôlés vers des CDN externes sans vérification d'intégrité créent des vulnérabilités dans la chaîne d'approvisionnement.

Schémas CSS qui doivent vous alerter :

  • style="display: none" disséminé partout (les styles inline compliquent la CSP et la revue)
  • Liens CSS vers des ressources tierces sans Subresource Integrity (SRI)
  • z-index: 999999 permet des superpositions plein écran
  • Mises en page Flexbox/Grid complexes que personne ne peut expliquer
  • CDN d'icônes et de polices externes chargés par défaut

Les outils de codage IA sont indifférents à vos préoccupations de sécurité : ils privilégient la vitesse sur la sécurité. Et cela se voit dans le résultat final. Les styles inline peuvent apparaître partout sans structure claire, ce qui complique l'application de la CSP avec style-src par la suite. Les CDN tiers depuis lesquels sont tirés les thèmes et les polices peuvent être des raccourcis qui créent un risque dans la chaîne d'approvisionnement.

Pour en savoir plus, consultez l'article dédié avec des conseils de défense pour le code généré par IA.

Juan Combariza
Growth Marketer Juan Combariza

Researching & writing about client side security.

FAQ

Frequently Asked Questions

Le CSS contrôle ce que voient les utilisateurs. Si votre CSS est manipulé, vos utilisateurs le sont aussi. Le CSS ne peut pas être utilisé comme arme seul — les attaquants ont d'abord besoin d'un point d'entrée comme le Cross-Site Scripting (XSS) ou une dépendance compromise. Une fois qu'ils sont dans la place, du CSS injecté peut être utilisé pour du phishing et de la fraude en trompant visuellement les utilisateurs.

Le XSS injecte du JavaScript malveillant dans votre page et peut effectuer des actions comme un vrai utilisateur, notamment voler des cookies ou capturer des frappes clavier. L'injection CSS, en revanche, manipule ce que les utilisateurs voient sur une page web et constitue généralement la deuxième étape d'une attaque, après qu'une page a déjà été compromise.

Oui. Les styles inline ajoutent un attribut style directement aux éléments dans le HTML, ce qui crée des angles morts de sécurité sur les sites web grands et complexes. Si des attaquants exploitent une vulnérabilité comme le XSS, ils peuvent injecter des styles inline malveillants dans tout le HTML, les rendant extrêmement difficiles à trouver et à examiner à grande échelle.

La Content Security Policy (CSP) fonctionne comme un agent de sécurité à l'entrée : elle vérifie les accréditations mais ne peut pas contrôler le comportement à l'intérieur. Bien que la CSP bloque les styles inline par défaut, de nombreux sites activent unsafe-inline pour éviter de casser des fonctionnalités. Cela crée une vulnérabilité car les attaquants peuvent injecter des styles inline malveillants n'importe où, et la CSP les autorisera. Des alternatives plus sûres incluent l'utilisation de nonces ou de hashes pour les blocs `