Comment les sites repèrent ton VPN… et comment coder ça en JavaScript

Découvrez comment les sites web savent que vous utilisez un VPN. La technique de la discordance de fuseau horaire expliquée en détail avec du code JS
VPN : Comment les sites savent que tu caches ton identité

Tu penses être un fantôme du web avec ton VPN payé en crypto ? Mignon. Tu te connectes depuis la Suède pour mater le catalogue Netflix local, et tu te sens comme un hacker dans un film. Laisse-moi te ramener sur terre. Les sites web, surtout les plus gros (streaming, banques, e-commerce...), ont des tours dans leur sac pour démasquer ton petit manège. Et non, ils ne se contentent pas de vérifier une liste d'IPs connues.

Aujourd'hui, on va décortiquer l'une des techniques les plus élégantes et les plus efficaces pour griller un utilisateur de VPN : le piège du fuseau horaire. C'est une méthode basée sur une logique implacable : ton masque (ton VPN) peut mentir sur ta position, mais ton appareil, lui, est souvent un très mauvais menteur.

Info ! Le but ici est purement éducatif. Comprendre ces mécanismes te permet de mieux saisir les enjeux de l'anonymat en ligne et les limites des outils que tu utilises. C'est en connaissant les méthodes de l'adversaire qu'on apprend à mieux se défendre.

La méthode bourrin : les listes noires d'IP

Avant d'entrer dans le vif du sujet, parlons de la méthode la plus évidente : les listes noires. La plupart des adresses IP fournies par les services VPN sont connues. Elles appartiennent à des centres de données (datacenters), pas à des fournisseurs d'accès Internet résidentiels comme Orange ou Free.

Des services comme MaxMind ou IP2Location vendent des bases de données qui classifient les adresses IP. Un site peut simplement vérifier ton IP dans ces listes. Si elle est taguée comme "VPN" ou "Datacenter", c'est grillé. C'est efficace, mais ça demande des mises à jour constantes et ça peut rater les nouveaux serveurs VPN. C'est pour ça que les sites intelligents ne s'arrêtent pas là.

Le piège du fuseau horaire : la logique implacable

C'est ici que ça devient intéressant. Oublie les listes. On va utiliser la logique pure, et JavaScript est notre arme. Le principe est d'une simplicité déconcertante : on va comparer le fuseau horaire de ton adresse IP avec le fuseau horaire de ton système d'exploitation. S'ils ne correspondent pas, il y a un loup.

Décortiquons le raisonnement, étape par étape, avant même de voir une seule ligne de code :

  1. Étape 1 : Obtenir l'adresse IP et sa localisation.
    On utilise une API externe (comme on l'a vu dans l'article précédent) pour récupérer l'adresse IP publique de l'utilisateur. Mais cette fois, on choisit une API qui nous donne aussi le fuseau horaire associé à cette IP. Par exemple, l'API ipwho.is peut nous retourner que ton IP 123.45.67.89 se trouve à Los Angeles, avec le fuseau horaire "America/Los_Angeles". C'est l'information de ton "masque".
  2. Étape 2 : Interroger l'horloge interne de ton navigateur.
    C'est là que la magie opère. JavaScript peut accéder à la configuration de ton système d'exploitation via le navigateur. Avec une simple commande, Intl.DateTimeFormat().resolvedOptions().timeZone, on obtient le fuseau horaire réel de ton ordinateur. Si tu es à Paris, cette commande retournera "Europe/Paris", peu importe où ton VPN prétend être. C'est l'information de ton "vrai toi".
  3. Étape 3 : La confrontation.
    Le script a maintenant deux informations :
    • Fuseau horaire de l'IP : "America/Los_Angeles"
    • Fuseau horaire du système : "Europe/Paris"
    La conclusion est évidente. Est-il crédible qu'une personne se trouvant physiquement à Los Angeles ait son ordinateur réglé sur l'heure de Paris ? C'est extrêmement improbable. Un utilisateur normal a son horloge synchronisée sur son emplacement. Cette incohérence est une signature quasi certaine de l'utilisation d'un VPN ou d'un proxy.

Cette méthode est redoutable car il est très facile d'oublier de changer le fuseau horaire de son système quand on active un VPN. Et même si on y pense, le faire manuellement à chaque changement de serveur est une contrainte énorme que peu de gens s'imposent.

Le code : mettre le piège en place

Assez parlé. Voyons comment coder ce petit mouchard. On va créer une fonction qui fait les deux appels (API IP et horloge locale) et qui affiche le verdict.

<div id="vpn-detector">
  <h3>Analyse de votre connexion en cours...</h3>
  <p id="result">Veuillez patienter.</p>
</div>
async function detectVPN() {
  const resultElement = document.getElementById('result');
  if (!resultElement) return;

  try {
    // Étape 1 : Fuseau horaire du navigateur
    const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;

    // Étape 2 : Obtenir fuseau via IP avec ipwho.is
    const response = await fetch('https://ipwho.is/');
    if (!response.ok) {
      throw new Error("Échec de la requête vers l'API IP.");
    }

    const data = await response.json();
    if (!data.success) {
      throw new Error(`API IPWho.is a échoué : ${data.message}`);
    }

    const ipTimezone = data.timezone?.id || 'Inconnu';

    let resultHTML = `
      <p>🕒 Fuseau navigateur : <b>${browserTimezone}</b></p>
      <p>🌍 Fuseau IP (${data.ip}) : <b>${ipTimezone}</b></p>
    `;

    // Étape 3 : Comparaison
    if (browserTimezone === ipTimezone) {
      resultHTML += `<p style="color: green; font-weight: bold;">✅ Aucun signe évident de VPN.</p>`;
    } else {
      resultHTML += `<p style="color: red; font-weight: bold;">⚠️ Incohérence détectée : VPN ou Proxy suspecté.</p>`;
    }

    resultElement.innerHTML = resultHTML;
  } catch (error) {
    resultElement.innerHTML = `<p style="color: orange;">❌ Erreur lors de la détection : ${error.message}</p>`;
  }
}

window.addEventListener('DOMContentLoaded', detectVPN);

Les autres indices qui te trahissent

Le piège du fuseau horaire est puissant, mais ce n'est pas le seul. Les sites peuvent croiser plusieurs informations pour augmenter leur niveau de confiance :

  • Fuites WebRTC : L'API WebRTC, utilisée pour la communication vidéo/audio en direct, a une fâcheuse tendance à révéler ta véritable adresse IP locale (celle de ton réseau domestique, genre 192.168.1.x), même si tu es derrière un VPN. Un script peut facilement détecter cette fuite.
  • Incohérences de langue : Ton IP est américaine, ton fuseau horaire est américain, mais la langue de ton navigateur (envoyée dans l'en-tête HTTP `Accept-Language`) est `fr-FR`. C'est un autre drapeau rouge.
  • Latence (Ping) : Un script peut mesurer le temps de réponse entre ton navigateur et le serveur. Si tu prétends être à New York mais que la latence est très faible (ce qui suggère que tu es géographiquement proche du serveur qui est, disons, à Paris), c'est suspect.

Conclusion : L'anonymat est un combat

Tu l'as compris, se cacher derrière un VPN n'est pas une cape d'invisibilité. C'est le début d'un jeu du chat et de la souris. Les sites web sont devenus experts dans la détection d'incohérences, et la comparaison des fuseaux horaires est l'une de leurs armes les plus affûtées.

Attention ! La solution que l'on à présentée fonctionne, mais elle n'est pas infaillible. En effet, si votre VPN ne change pas automatiquement l'heure, notamment lorsque vous l'utilisez sur un smartphone, il y a de fortes chances que l'heure ne soit pas modifiée. Cette méthode reste donc purement dissuasive, mais ne garantit pas une anonymisation totale.

Cela ne veut pas dire que les VPN sont inutiles, loin de là ! Ils restent essentiels pour chiffrer ta connexion, te protéger sur les Wi-Fi publics et contourner certaines restrictions. Mais pour un anonymat quasi total, il faut une discipline de fer : synchroniser son fuseau horaire, sa langue, utiliser des navigateurs configurés pour la vie privée et bloquer les fuites comme WebRTC.

Ton défi ultime ! Améliore le script de détection ! Crée un "score de suspicion". Le script doit non seulement vérifier le fuseau horaire, mais aussi la langue du navigateur (`navigator.language`). Si le pays de l'IP ne correspond pas à la langue (par exemple, IP américaine et langue française), augmente le score. Affiche un verdict final : "Faible suspicion", "Suspicion moyenne" ou "C'est sûr, t'es grillé !".

4 commentaires

  1. Anonyme
    Merci pour ce super article. C'est très enrichissant
  2. Anonyme
    Ah j'oubliais de mentionner de mentionner mon nom télégramme. Moi c'est foxtrot elhalj
  3. Anonyme
    Ça, c’est un joyau ! Pourtant, c’est si simple… Merci !
    J’ai testé, et je trouve que les résultats sont plutôt positifs. Merci beaucoup pour le temps… Sérieusement, à une époque, je cherchais cette solution, mais je ne trouvais rien.
    Parfois, avec un peu de logique et de réflexion, on peut créer quelque chose qu’on pensait complexe, mais qui est en réalité simple.
  4. Salih
    😍 encore une pépite merci beaucoup
N'hésitez pas de mentionner votre nom d'utilisateur Telegram à la fin de votre message pour recevoir des cadeaux de la part des modérateurs. Merci de commenter