Par défaut, la plupart des navigateurs vous renvoient vers un moteur de recherche partenaire, ayant payé cette mise en avant. Malheureusement, il s'agit rarement d'un service respectueux de la vie privée. Et si on développait une extension pour changer ça ?
Nous avons récemment mené un tour d'horizon du marché des navigateurs. Nous faisions alors un constat amer : tous (ou presque) partagent un même défaut. Ils dirigent l'internaute vers un moteur de recherche financé par la publicité ciblée et la collecte de données. Bref, votre navigateur aide un tiers à vous pister en ligne.
Il y a bien quelques exceptions, comme Brave et Vivaldi, mais réservées à la navigation privée. L'utilisateur peut aussi changer ce paramètre plus ou moins facilement selon les cas, mais les géants de la recherche font tout pour rester présents, quitte à parfois s'imposer. Ce sans compter sur les automatismes de l'internaute, qui ont tendance à le trahir.
Récemment, un adepte du moteur français lui demandait une solution pour contourner ce problème via Twitter :
@Qwant_FR Bonjour ! Est-ce que vous savez s'il existe un plugin Firefox qui m'empêche de taper instinctivement "https://t.co/JqWkqG3NNA" avant de faire une recherche ? Ou alors qui me redirige vers Qwant ? J'ai de mauvaises habitudes.
— nicosomb (@nicosomb) 25 juillet 2018
Détecter et bloquer une requête
Nous ne reviendrons pas sur les fondements de la création d'une extension, déjà évoquée dans notre précédent article. Idem pour les fondamentaux du trio CSS/HTML/JavaScript, utilisé aussi bien par Chrome et ses dérivés que par les versions récentes de Firefox (WebExtensions).
Commençons par définir l'objectif de notre outil.
, quels que soient les paramètres de son navigateur, .Nous pourrions l'effectuer au niveau du fichier hosts du système ou du résolveur DNS, pour que tous les utilisateurs du réseau local puissent en profiter, mais ces méthodes ont un inconvénient : elles ne permettent que de bloquer ou de renvoyer un domaine principal, sans reprendre le contenu d'une URL. Or, notre outil doit fonctionner aussi bien dans le premier cas (google.fr par exemple) que si une recherche spécifique est lancée (Next INpact sur bing.com).
Nous allons utiliser l'API WebRequest, qui permet d'analyser et de traiter les requêtes émises par le navigateur. Elles passent par une multitude d'états avant d'être complétées. Ici, onBeforeRequest
nous sera utile, puisqu'il permet d'intercepter la requête avant même qu'elle ne soit émise.
Lorsque nous en détecterons une à destination d'un moteur de recherche, nous l'intercepterons pour l'analyser et renvoyer l'utilisateur vers un autre service si nécessaire.
Création de l'extension et d'un premier PoC
Première étape : le manifeste. Ce fichier contient les informations concernant l'extension et se nomme manifest.json
. Nous allons l'utiliser afin de créer un premier Proof of Concept (PoC) disposant de la base minimale pour bloquer un utilisateur se rendant sur Google.com et le renvoyer vers Framabee de Framasoft.
Cette mouture initiale du manifeste contient donc uniquement le nom et la description de notre outil, un numéro de version et ses différentes autorisations :
Comme vous pouvez le voir, c'est assez simple. Trois permissions sont données : la première pour l'accès à l'API WebRequest, la seconde pour bloquer des requêtes et la troisième pour les URL correspondant à un filtre. Celui-ci nous donnera l'autorisation d'agir pour les requêtes envoyées vers tous les sous-domaines de Google.com.
On déclare également un script background.js
qui sera lancé en tâche de fond dès l'installation de l'extension. Il sera chargé d'intercepter et d'analyser les requêtes. Là aussi, c'est service minimal pour cette première version :
Voilà, c'est terminé ! Comme vous pouvez le voir, le code est simpliste : on écoute les requêtes de tous les sous-domaines de Google.com en indiquant que l'on est susceptible de les bloquer. Dès qu'une est détectée, on la renvoie vers la page d'accueil de Framabee (ou l'URL de n'importe quel autre service de votre choix).
Chargement de l'extension dans votre navigateur
Il faut maintenant tester ce premier bout de code. Dans Chrome, cela demande de passer par le mode développeur dans la section consacrée aux extensions (chrome://extensions/
), puis de cliquer sur « Chargez l'extension non empaquetée », afin de sélectionner le dossier contenant vos fichiers.
Sous Firefox, il faut vous rendre dans la section consacrée au débogage des modules (about:debugging#addons
) et faire de même après avoir cliqué sur « Charger un module temporaire » :
Si tout s'est bien passé, tentez de vous rendre sur Google.com. Vous serez alors automatiquement redirigé vers Framabee (ou l'URL de votre choix). Un fonctionnement limité puisqu'il ne concerne que le domaine .com de Google, mais pas ses déclinaisons internationales ou d'autres moteurs de recherche.
De plus, si vous tapez une des mots-clés dans la barre principale, la redirection ne sera pas active.
Interception d'une recherche
Pour gérer ce dernier cas, rien de plus simple : il suffit d'ajouter une étoile à la fin du filtre d'URL. Cela indique que l'on veut intercepter toutes les adresses débutant par google.com. Ce nouveau filtre fonctionnera pour ces deux URLS :
La précédente version n'interceptait que la première. Un problème reste néanmoins : comment récupérer les mots-clés de la recherche pour les utiliser dans la redirection ? Ici, c'est l'interface URL de JavaScript qui va nous être utile puisqu'elle permet de décomposer une adresse en plusieurs éléments.
Lors d'une recherche, les moteurs utilisent en général le schéma suivant :
http(s)://[adresse]?q=[mots clés]
Il suffit d'isoler le paramètre « q » et de modifier l'adresse pour mettre en place la redirection. Là encore, seules quelques lignes de code suffisent :
Et voilà ! En cherchant un terme sur Google.com, nous sommes bien renvoyés vers Framabee avec les mêmes mots-clés. Seul problème, sans recherche, le terme « null » est utilisé. La raison est simple : c'est la valeur renvoyée par la méthode searchParams()
lorsque le paramètre « q » est vide.
Pour l'éviter, il suffit de vérifier le contenu du paramètre puis décider quelle adresse utiliser :
Ici, on définit la constante keywords
depuis les paramètres de l'URL. Ensuite, on utilise l'opérateur ternaire avec cette constante comme condition. Si elle est définie, c'est que des mots-clés font partie de l'URL. On renvoie alors vers une adresse de recherche qui les contient. Sinon on renvoie vers la page d'accueil de Framabee.
Gestion de plusieurs moteurs de recherche
Notre extension fonctionne désormais correctement, mais elle reste limitée à une déclinaison d'un moteur de recherche de Google. Nous allons l'étendre aux différentes versions locales (.com, .fr, etc.) mais aussi à Bing ou Yahoo. Une liste qui peut être complétée comme bon vous semble.
Pour cela, une première solution consiste à ajouter tous les domaines possibles dans notre filtre de requête. Problème : on ne peut pas ajouter un filtre de type *.google.*, ce qui nous forcerait à ajouter l'URL du service dans tous les pays du monde. Nous allons donc devoir procéder autrement.
Ainsi, on étend les permissions de l'extension à l'ensemble des URL possibles, et n'effectuons une redirection que lorsque certains mots sont détectés dans le nom de domaine de la requête. Une solution moins élégante mais qui correspond tout à fait à notre besoin.
Pour cela nous allons tout d'abord modifier le manifeste :
Puis le script :
Ici, on a simplement ajouté une condition concernant le contenu du nom de domaine, en vérifiant s'il contenait des valeurs telles que « bing. », « google. » ou « yahoo. » via le test d'une expression régulière. Attention tout de même, cela aura tendance à rediriger un grand nombre de services annexes, ce qui pourra poser souci dans certains cas.
Il sera alors possible d'affiner les critères ou d'utiliser le mode de navigation privée, ce qui a l'intérêt sous Chrome de ne pas activer les extensions. Ainsi, vos recherches seront constamment redirigées, exceptées dans ce mode où vous n'êtes connectés à rien et où vos informations sont automatiquement effacées à la fin de la session.
Nous avons utilisé ce guide pour finaliser une extension fonctionnant sous Chrome et ses dérivés, mais aussi Firefox, qui redirige vos recherches vers un moteur respectueux de la vie privée tel que DuckDuckGo, Framabee, Oscobo, Qwant ou Startpage. Vous pouvez simplement la télécharger ou consulter son code source et y participer :