S'il vous reste du temps
Tentative d'identification active
Si jamais aucune ligne d'identification n'est envoyée par un serveur au bout d'une seconde, il peut être intéressant de tester s'il s'agit d'un serveur web afin notamment de voir s'il répond avec un header Server
qui permet d'identifier le logiciel qui tourne. La manière de procéder pourrait être :
- Envoyer la chaîne "GET / HTTP/1.0\r\n\r\n" qui est une requête HTTP/1.0 basique qui ne précise pas le nom de l'hôte.
- Lire les lignes renvoyées par le serveur, et dans les headers (lignes avant la première ligne vide) identifier la ligne commençant par "Server:" et la renvoyer.
Bien entendu un timeout d'une seconde devrait également être configuré autour de l'ensemble de cette opération.
Amélioration du programme précédent
Dans le programme qui vérifie sur Have I been pwned? si les mots de passe de nos comptes ont déjà fait partie d'une fuite de données, nous utilisons des fonctions bloquantes du crate reqwest
, ce qui limite nos performances puisque nous récupérons les pages de suffixes de SHA-1 séquentiellement ou presque (paralléliser par le nombre de cœur d'un ordinateur portable n'est pas une grosse parallélisation pour des entrées-sorties réseau).
En utilisant l'API non-bloquante de reqwest
et les streams, notamment grâce à la méthode buffered
de futures::stream::StreamExt
, vous pouvez effectuer un plus grand nombre de requêtes simultanées à l'API de Have I been pwned?. Les performances devraient en être grandement améliorées.
Important : n'utilisez pas FuturesUnordered
ou FuturesOrdered
qui ne limiteraient pas le nombre de connexions simultanées. La méthode buffered
vous permet de préciser le nombre de requêtes "en vol" simultanément. Utilisez une valeur qui vous semble raisonnable.