5.8 KiB
Les moteurs
Moteur pseudonyme — engines/username/
Bâti sur Maigret 0.6.5 (MIT, commercial autorisé sans restriction).
La base embarquée compte 3 302 sites, dont 3 277 en id_type=username.
Par défaut on interroge les 500 mieux classés ; la recherche approfondie monte
à 3 000. ranked_sites_dict ajoute les miroirs des plateformes bien classées
— un lecteur tiers d'Instagram reste interrogé même si Instagram est désactivé.
Ce qui a été ajouté au-dessus de Maigret
Progression en direct. Maigret attend un objet « notifier » à la
QueryNotifyPrint. On lui en fournit un qui dépose les évènements dans une file
asyncio au lieu d'écrire sur la sortie standard. L'interface affiche donc
l'avancement site par site.
Variantes de nom. Maigret possède --permute, mais il produit un volume
ingérable : trois mots et quatre séparateurs dépassent la centaine de variantes,
soit autant de fois 500 requêtes. On génère les nôtres, ordonnées par
probabilité et tronquées. « Hubert Cornet » donne, dans l'ordre :
hubertcornet, hubert.cornet, hubert_cornet, hubert-cornet, hcornet,
h.cornet, … L'utilisateur voit la liste avant de lancer.
Notation. Voir plus bas.
Recherche récursive bornée. Les pseudonymes découverts dans les profils (un compte GitHub qui cite un compte X) relancent une recherche, limitée à 3 pseudonymes et aux 100 premiers sites : elle sert à confirmer un lien, pas à relancer un balayage complet.
Moteur e-mail — engines/email/
Maigret ne fait que le pseudonyme. Aucun id_type e-mail n'existe dans sa
base. Ce moteur est donc entièrement composé, du plus fiable au plus incertain :
| Module | Source | Fiabilité | Actif par défaut |
|---|---|---|---|
email.dns |
MX, SPF, DMARC | factuelle | oui |
email.gravatar |
api.gravatar.com/v3 | élevée | oui |
email.jetable |
liste embarquée | indicative | oui |
email.fuites |
Have I Been Pwned | élevée | non (clé payante) |
email.holehe |
formulaires de récupération | variable | non |
email.pivot |
partie locale de l'adresse | piste | oui |
Gravatar : attention à l'empreinte. Le service est passé de MD5 à SHA-256, sur l'adresse nettoyée et mise en minuscules. Toute intégration écrite avant ce changement est cassée. Sans clé : 100 requêtes par heure ; avec clé : 1 000. Les comptes vérifiés déclarés sur un profil Gravatar sont traités comme des résultats à part entière — ce sont des liens affirmés par le titulaire.
holehe est isolé dans un conteneur. Deux raisons, toutes deux sérieuses. Licence : holehe est sous GPLv3, Limier sous MIT ; l'importer contaminerait tout le projet. Fraîcheur : plus de publication réelle depuis décembre 2023, de nombreuses demandes de fusion en attente, des modules qui cassent au fil des changements chez les plateformes. Méthode, enfin : holehe sollicite les formulaires « mot de passe oublié » avec l'adresse recherchée. La cible n'est pas notifiée, mais chaque contrôle interpelle un service tiers. D'où la désactivation par défaut.
Moteur domaine — engines/domain/
Le plus simple : toutes les sources sont publiques par conception et aucune ne bloque.
RDAP plutôt que WHOIS. Réponse JSON normalisée (RFC 9083) au lieu d'un texte libre à analyser par expressions régulières.
Bootstrap IANA plutôt que rdap.org. Le service rdap.org est pratique mais
limité à 10 requêtes par tranche de 10 secondes derrière Cloudflare, et sa
documentation invite les clients réguliers à consommer les registres de
bootstrap. On télécharge donc data.iana.org/rdap/dns.json (RFC 9224) une fois
par 24 h et on interroge directement le serveur du registre. Aucun tiers sur le
chemin.
Les coordonnées du titulaire sont presque toujours masquées depuis le RGPD : c'est le comportement normal, l'interface le signale explicitement plutôt que d'afficher un vide déroutant.
Journaux de transparence des certificats. crt.sh en source primaire — le plus complet, gratuit, sans clé. Son défaut est connu : PostgreSQL partagé qui sature régulièrement, indisponibilités fréquentes. Bascule automatique sur Certspotter en cas d'échec. Chaque nom découvert est vérifié en DNS pour séparer ce qui résout encore de ce qui est historique — c'est cette distinction qui rend la liste exploitable.
La notation — engines/scoring.py
Le vrai différenciateur face à un scanner naïf, qui considère « trouvé » tout site répondant 200 alors que beaucoup rendent 200 sur une page « utilisateur inconnu ».
| Signal | Poids |
|---|---|
| profil extrait | +0,35 |
| nom affiché | +0,15 |
| avatar | +0,10 |
| métriques sociales | +0,10 |
| identifiant interne | +0,10 |
| site bien classé (< 10 000) | +0,10 |
| liens vers d'autres comptes | +0,05 |
| correspondance élargie (miroir) | −0,25 |
site marqué unchecked |
−0,20 |
Seuils : confirmé ≥ 0,60, probable ≥ 0,30, faible en dessous.
Les seuils et les poids sont dans ce fichier et nulle part ailleurs : c'est le seul endroit à toucher pour rendre l'outil plus ou moins strict.
Les signaux sont stockés avec chaque résultat et affichés dans l'interface. L'utilisateur voit pourquoi un résultat est confirmé, au lieu de faire confiance à un score opaque.
Les résultats factuels (RDAP, DNS, CT) passent par scorer_fait_technique :
l'enregistrement existe ou non, les signaux de profil n'y ont pas de sens.