Développez une extension forçant l'utilisation d'un moteur de recherche respectueux de la vie privée

Développez une extension forçant l’utilisation d’un moteur de recherche respectueux de la vie privée

Quelques lignes de code qui changent tout

Avatar de l'auteur
David Legrand

Publié dans

Logiciel

06/09/2018 9 minutes
22

Développez une extension forçant l'utilisation d'un moteur de recherche respectueux de la vie privée

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.

Il peut ainsi se rendre machinalement sur Bing ou Google, plutôt que sur une alternative plus respectueuse de la vie privée comme DuckDuckGo ou Qwant. Récemment, un adepte du moteur français lui demandait une solution pour contourner ce problème via Twitter :

C'est ce qui nous a motivé à travailler sur une extension, remplissant cet office en quelques lignes de code. C'est si simple que nous allons vous expliquer comment vous auriez pu la développer vous-même, avec quelques recherches et peu de connaissances techniques.

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. Il doit diriger l'utilisateur vers un moteur de recherche plus respectueux de la vie privée, quels que soient les paramètres de son navigateur, pour empêcher l'envoi d'informations à un moteur susceptible de le pister en ligne.

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.

Navigateurs Extensions WebRequest API

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 » : 

Extension DéveloppementExtension Développement

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 :

Écrit par David Legrand

Tiens, en parlant de ça :

Sommaire de l'article

Introduction

Détecter et bloquer une requête

Création de l'extension et d'un premier PoC

Chargement de l'extension dans votre navigateur

Interception d'une recherche

Gestion de plusieurs moteurs de recherche

Le brief de ce matin n'est pas encore là

Partez acheter vos croissants
Et faites chauffer votre bouilloire,
Le brief arrive dans un instant,
Tout frais du matin, gardez espoir.

Fermer

Commentaires (22)


Pas d’extension pour Edge ? <img data-src=" />


C’est une WebExtension, donc ça devrait fonctionner. Mais bon Edge n’est pas encore très ouvert aux extensions tierces donc j’attends pour les inclure dans ce genre de papiers.


Ça marche plutôt bien. J’ai justement travaillé sur une WebExtension NextInpact et ça fonctionne bien et compatible avec tous les navigateurs !


Je regarderai à l’occasion ;) Mais le code utilisé ici devrait fonctionner dans tous les cas (sous peu qu’ils fassent un binding des API comme le faire Firefox)


Je te passe au grill ce WE avec une pullrequest.

J’ai vérifié rapidement (au taff bien sur).http://jshint.com/

1 Use the function form of “use strict”.

53 [‘selectedSearchEngine’] is better written in dot notation.



Par contre levé de drapeau rouge sur l’utilisation du chrome.* !

change tout cela par browser ! Ne pas s’enfermer dans la google dépendance qui a pourri le web pendant 5 ans avec ses CSS préfixés et ses objets javascripts :)

https://caniuse.com/#search=browser



Voila, j’avais besoin d’embêter quelqu’un :) <img data-src=" />


J’utilise notamment ceux là parce qu’ils passent partout, FF adapte automatiquement ;) Disons que ça m’évite d’avoir à me demander ce qui existe en browser. ou pas, sachant que le navigateur va de toutes façons le faire si nécessaire <img data-src=" />


Et après on nous fait des articles sur un monde ouvert, respectueux et libre des GAFAM. <img data-src=" />

Va donc, hé, espèce de … de … développeur ? #LesDévelopeursSontTousDesFénaiasses #LibérezLesDéveloppeur #RegardeMamanJePasseALaTélé <img data-src=" />


Intéressant, mais je ne comprends pas bien le concept en fait…?

A partir du moment où (je l’ai fait récemment pour Vivaldi qui est un bien chouette navigateur) on configure la recherche avec le moteur de notre choix, à quelles occasions risque-t-on d’en utiliser un autre? (à part en se rendant volontairement sur la page de ce moteur)



(bon après j’ai un autre problème, quand j’essaye un nouveau moteur je reviens vite à google pour trouver des résultats satisfaisants… mais ça c’est une question de temps)


Tu peux lire les commentaires du 2eme article: c’est évoqué là bas:

https://www.nextinpact.com/news/107005-privacy-search-notre-extension-favorisant…

Ici c’est plus un échange sur le développement de l’extensions








recoding a écrit :



(bon après j’ai un autre problème, quand j’essaye un nouveau moteur je reviens vite à google pour trouver des résultats satisfaisants… mais ça c’est une question de temps)





Cette partie est quand même de plus en plus fausse et oublie un élément : plus on utilise des alternatives, plus elles s’affinent. On peut aussi se plaindre que ce n’est jamais assez fiable et ne pas faire d’efforts, mais ça relève de la situation assez contradictoire.



Au passage, Startpage par exemple est une sorte de proxy pour les SERP de Google, donc ça devrait aller niveau fiabilité ;)









David_L a écrit :



Cette partie est quand même de plus en plus fausse et oublie un élément : plus on utilise des alternatives, plus elles s’affinent. On peut aussi se plaindre que ce n’est jamais assez fiable et ne pas faire d’efforts, mais ça relève de la situation assez contradictoire.





Oui quand je dis “c’est une question de temps” je fais référence au temps qu’il faut aux moteurs pour progresser, et aussi au temps qu’il faut pour changer ses habitudes <img data-src=" />

Mais ma remarque ne s’adresse pas spécifiquement aux moteurs “indépendants”, j’ai beaucoup de mal avec les résultats de Bing par exemple.



Intéressant comme concept d’extension, même si en l’état c’est … extrêmement restrictif. De fait, on ne peut plus du tout accéder aux autres services des domaines filtrés brutalement (genre google maps, gmail, etc).



Donc ça se limite à un public déjà 100% converti dans les alternatives. Dans mon cas je suis en phase de transition des services google vers d’autres, mais ça prend des plombes globalement.


C’est aussi pour ça qu’un sevrage brutal peut être nécessaire, ça évite de trainer par paresse <img data-src=" />


C’est pas faux, néanmoins ça rend la tâche tellement pénible et punitive que ça aurait plutôt un effet négatif d’affaiblir le souhait de sevrage…


Ouaip, c’est comme ça que je suis finalement passée à Linux.


Tu aurais du appeler cette extension “Patch Google” (au sens patch nicotine) pour se rendre compte à quel point il est devenu une dépendance vitale au Web.


Vraiment intéressant comme article, merci David <img data-src=" /> <img data-src=" />



Bon je ne me sens pas vraiment de taille a essayer ça. A lire l’article (très détaillé) et les commentaires cela semble si simple mais je n’ai pas peur d’avouer que ça me fout les chocottes <img data-src=" />


J’ai une remarque et une question :)



La remarque, c’est “cool, enfin un moyen d’utiliser Qwant avec de la saisie semi-automatique, ce que ne permet pas un changement de moteur de recherche”



La question, c’est “mais du coup, la saisie semi-auto dépend du moteur, donc les données sont envoyées en live au moteur ? Ces données là ne sont pas redirigées du coup, Google conserver la requêtes globale ?”


On est sur du “onBeforeRequest” (cf code cité dans l’article) donc la requête n’est même pas renvoyée à Google.


C’est valable pour l’appui sur “Enter”.

Mais tu noteras que lorsque tu saisis des caractère dans la barre d’adresse, il y a des propositions de recherche, qui ne proviennent probablement pas localement de Firefox… Ça veut donc dire que la frappe partielle est envoyée à un moteur (lequel, je ne sais pas) qui renvoie les propositions. Donc tu es toujours avant l’envoi de la requête, mais c’est pas grave, elle est déjà envoyée…



Et en cherchant vaguement, j’ai eu confirmation :&nbsp;https://support.mozilla.org/en-US/kb/search-suggestions-firefox



A voir ce qu’ils en font, mais globalement, ils ont la requête avant même qu’elle soit validée… Il faut désactiver cette fonctionnalité pour être vraiment safe…



Sinon j’ai abandonné l’extension, elle a des effets de bord. Par exemple impossible d’aller sur Google maps, ça renvoie systématiquement sur Qwant…


Oops


Ah exact, la barre d’adresse est géré par omnibox, et d’ailleur edge ne permet pas la personalisation.



https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/user_interfa…

https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/API/omnibox



Il va falloir capturer le traffic de l’omnibox pour éviter les suggestions (mais bon il faudrait surtout de base changer le moteur de recherche configuré par défaut si c’est un “non respectueux”).