En octobre 2015, l’IAB (Interactive Advertising Bureau), qui représente les acteurs de la publicité en ligne, a reconnu que « nous nous sommes plantés ». Dans un communiqué, l’organisation s’est lancée dans une autocritique : elle a admis à quel point ses adhérents ont usé et abusé des publicités bloquantes, gênantes et ultra ciblées afin de s'assurer toujours plus de revenus. Aussi, dans l’optique d’éviter de se retrouver dans une impasse, l'IAB a lancé un programme de certification nommé LEAN (Light, Encrypted, Ad choice supported, Non-invasive ads), pour les publicités en ligne réservées aux formats qui sont « légers, chiffrés, qui donnent le choix à l’utilisateur et qui ne sont pas invasives ».
Certaines plateformes ont choisi de se lancer dans un jeu du chat et de la souris avec les bloqueurs de publicité : tandis qu’ils utilisaient des moyens pour détecter et priver d’accès à leurs contenus les utilisateurs qui se servaient d’un bloqueur de publicité, de leur côté, ces derniers cherchaient des moyens de contourner ce blocage. Cela a été par exemple le cas avec les quotidiens Business Insider et Forbes. Mais comment les plateformes s’y prenaient-elles pour détecter les bloqueurs de publicité ?
Pour ceux qui ont voulu lire un article sur le site Business Insider et avaient un bloqueur de publicité comme Adblock Plus, ils ont dû tomber sur un message leur indiquant que Business Insider est un média financé par la publicité et ils étaient alors invités à désactiver leur bloqueur de publicité ou à passer à un accès payant.
Business Insider se sert de piano.io de VX qui est décrit comme étant l’évolution du paywall, un système qui sert à bloquer tout ou partie de l'accès à un site web à l'aide d'un système de paiements. Sur le site, concernant la détection des bloqueurs de publicité, il est expliqué que l’implémentation actuelle pour détecter si un navigateur dispose d’un bloqueur de publicité activé ne dépend que de vous ; cependant, ce simple script va tenter de charger un fichier qui sera bloqué par la plupart des adblockers. Il va alors enregistrer un callback onerror qui va attribuer la valeur true. Par la suite, un callback onload va attribuer la valeur false à __adblocker .
Piano lit le cookie __adblocker sur le navigateur pour exécuter sa logique. Les règles de la façon dont Piano traite le cookie sont simples :
Si le cookie __adblocker n'existe pas, l'état adblocker sera enregistré comme non détecté ;
Si le cookie __adblocker est défini et est soit le booléen true soit la chaîne de caractères "true", l'état adblocker sera enregistré comme activé ;
Si le cookie __adblocker est vide et que le booléen est défini comme étant false ou alors s’il y a une chaîne de caractères différente de "true", l'état sera enregistré comme désactivé.
Code Javascript : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | <script> var setAdblockerCookie = function(adblocker) { var d = new Date(); d.setTime(d.getTime() + 60 * 60 * 24 * 30 * 1000); document.cookie = "__adblocker=" + (adblocker ? "true" : "false") + "; expires=" + d.toUTCString() + "; path=/"; } var script = document.createElement("script"); script.setAttribute("async", true); script.setAttribute("src", "//www.npttech.com/advertising.js"); script.setAttribute("onerror", "setAdblockerCookie(true);"); script.setAttribute("onload", "setAdblockerCookie(false);"); document.getElementsByTagName("head")[0].appendChild(script); </script> |
La solution de Piano s’appuie sur la bibliothèque open source FuckAdblock. Pour être plus précis, elle s’appuie sur une version alternative appelée BlockAdblock, « le même projet que FuckAdblock, mais avec un nom plus convenable ».
La page JavaScript du Business Insider cherche également à vérifier si le fichier FuckAdBlock js ne se charge pas, auquel cas elle détecte que l’utilisateur dispose d’un bloqueur de publicité activé.
La riposte ?
Les extensions Chrome ont la possibilité d'intercepter et de modifier les requêtes HTTP via l'API webRequest. Aussi, pour contourner cette détection, UBlock Origin intercepte la demande JavaScript de FuckAdBlock et répond avec un HTTP 307, le code d'une redirection temporaire. L'URL va rediriger vers un JavaScript encodé en base64 qui sera exécuté à la place de FuckAdblock.
Ce JavaScript alternatif va recréer une version fictive de FuckAdblock qui ne fait rien en réalité. De cette façon, si un fichier externe devait vérifier le statut de FuckAdblock, il verra que la bibliothèque s’est bel et bien chargée.
Mais FuckAdBlock a une réponse assez astucieuse au contournement d'uBlock. Il recommande l'utilisation de l'attribut d'intégrité pour la balise de script qui charge FuckAdBlock, ce qui fait que le navigateur n’arrive plus à charger la version de JavaScript encodée en base64 étant donné que les hash ne correspondent pas, ce qui va déclencher le callback onerror du script qui s’occupe de la détection. Business Insider n'a pas encore implémenté cette solution pour le moment.
Et du côté de Forbes, comment est-ce que c’est fait ?
Comme le Business Insider, Forbes s’appuie également sur une bibliothèque tierce pour détecter la présence d’un bloqueur de publicité : LiftDNA. Contrairement à Piano qui s’appuie sur une solution open source externe, LiftDNA a développé sa propre solution de détection.
LiftDNA et FuckAdblock présentent quelques similarités dans la façon d’effectuer les contrôles ; sur la page HTML de Forbes figure une chaîne codée en base 64 qui, sous sa forme décodée, contient des noms de classes CSS d’annonces facilement identifiables. Lorsque les bloqueurs de publicités voient ces éléments DOM avec ces noms de classes, ils les masquent immédiatement.
Du côté de Forbes, le contrôle est un peu plus complexe que chez Business Insider dans la mesure où il crée un élément div contenant entre 5 et 10 noms de classes choisis au hasard dans une grande liste, puis vérifie si l’attribut display prend la valeur none. De cette façon, il est plus difficile de créer des solutions de contournement car vous ne savez pas quelle classe ou quel style sera choisi. Si le code détecte que la balise div est masquée, alors l'utilisateur se sert d’un bloqueur d'annonce. Si ce n'est pas le cas, il définit un cookie et permet à l'utilisateur de continuer sa visite une fois qu’il a cliqué sur continuer. Voici la fonction qui permet de le réaliser :
Code Javascript : | Sélectionner tout |
1 2 3 4 5 | checkBlockedClasses: function() { for (var a, b = Math.random(), c = $(.ads-container>div), d = c.length, e = Math.floor(b * d), f = ${classes!} !== fbs_settings.classes ? JSON.parse(base64.decode(fbs_settings.classes)) : [dynamic-ads], g = [], h = this, i = 0; i < 5 || Math.random() < .7 && i < 10; i++) g.push(f[Math.floor(Math.random() * f.length)]); this.rand_classes = g, a = $(<div class= + g.join( ) + >).append(<div style=height: 1px;>), $(c[e]).before(a), window.navigator.userAgent.indexOf(Firefox) > -1 ? setTimeout(function() { a.height() || (h.triggered_by_classes = !0, h.triggerAdBlockState(!0)), a.remove() }, 100) : (none === a.css(display) && (this.triggered_by_classes = !0, this.triggerAdBlockState(!0)), a.remove()) |
La riposte ?
Forbes a été en mesure de bloquer Adblock / Adblock Plus, mais UBlock Origin a réussi à forcer Forbes à croire que le bloqueur de publicité était désactivé. Comment ?
Fondamentalement, si l'URL ressemble à la page d'accueil des annonces Forbes, elle définit le cookie 'welcomeAd' comme étant true, et si uBlock peut déterminer l'URL d'un article à partir d'un cookie, alors il redirige automatiquement vers lui.
Source : Bug Replay, GitHub (UBlock Origin, solution de contournement du blocage de Forbes), Piano (script de détection d'un bloqueur de publicité), FuckAdblock, GitHub (BlockAdblock)
Voir aussi :
L'IAB fait un état des lieux de l'écosystème de la publicité et propose des solutions pour que les utilisateurs abandonnent les bloqueurs de pub