Files
hcornet 78fb13b0e5
CI / Backend — lint, types, tests (push) Failing after 4m44s
CI / Interface — types et compilation (push) Successful in 10m23s
CI / Construction des images (sans publication) (push) Skipped
first sync
2026-09-12 13:10:16 +02:00

5.8 KiB
Raw Permalink Blame History

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.