Publié le 14/04/2016
Auteur Fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Charger le Whois d'un nom de domaine

Le Whois permet notamment d'identifier le propriétaire et l'hébergeur d'une site internet. Ces fiches de renseignements sont maintenues à jour pour chaque site web, voyons comment récupérer le contenu à l'aide d'un script PHP.

Quel registrar interroger ?

Un nom de domaine d'un site internet se compose d'un nom suivi d'une extension que l'on appelle aussi TLD (Top-Level Domain). A ce jour, il existe un foule d'extension possible pour ne citer que les plus connues: .com, .org, .net, .fr.
Ainsi pour charger le Whois d'un site internet, la première étape consiste à contacter le registrar en charge d'une extension et de lui transmettre notre requête sur le nom de domaine. Un tableau de correspondance entre le TLD et le l'organisme en charge de l'extension peut être constitué comme suit:

$servers = array(
"biz" => "whois.neulevel.biz",
"com" => "whois.internic.net",
"us" => "whois.nic.us",
"info" => "whois.nic.info",
"name" => "whois.nic.name",
"net" => "whois.internic.net",
"gov" => "whois.nic.gov",
"edu" => "whois.internic.net",
"int" => "whois.iana.org",
"ac" => "whois.nic.ac",
"ae" => "whois.uaenic.ae",
"at" => "whois.ripe.net",
"au" => "whois.aunic.net",
"be" => "whois.dns.be",
"bg" => "whois.ripe.net",
"br" => "whois.registro.br",
"bz" => "whois.belizenic.bz",
"ca" => "whois.cira.ca",
"cc" => "whois.nic.cc",
"ch" => "whois.nic.ch",
"cl" => "whois.nic.cl",
"cn" => "whois.cnnic.net.cn",
"cz" => "whois.nic.cz",
"de" => "whois.nic.de",
"fr" => "whois.nic.fr",
"hu" => "whois.nic.hu",
"ie" => "whois.domainregistry.ie",
"il" => "whois.isoc.org.il",
"in" => "whois.ncst.ernet.in",
"ir" => "whois.nic.ir",
"mc" => "whois.ripe.net",
..............

Premièrement, le tableau est quand même assez long et devra être déplacé dans un script PHP nommée constante. Et deuxièmement, cette solution est difficile à maintenir car de nouvelle extension sont ajoutées régulièrement.

Comment interroger le whois d'un domaine

Au lieu de maintenir un tableau de correspondance, nous allons demander à l'iana (Internet Assigned Numbers Authority) de nous indiquer le registrar en charger du TLD. Avec cette information, il suffit d'ouvrir un socket, de questionner le serveur de Whois puis de récupérer les informations sur le site internet.

<?php
/**
 * Charger le Whois d'un nom de domaine
 * http://www.fobec.com/php5/1174/charger-whois-nom-domaine.html
 * @author Fobec avril 2016
 */
 
class Whois_DomainName {
 
    //5 secondes
    const TIMEOUT_REQUEST = 5;
    //Dernière erreur
    public static $last_error = '';
 
    /**
     * Charger le Whois d'un nom de domaine
     * @param type $domain_name
     * @return boolean
     */
    public static function query($domain_name) {
        //Rechercher le server de Whois à  interroger
        $whois_buf = self::query_server('whois.iana.org', $domain_name);
        if ($whois_buf == FALSE) {
            $last_error = 'unknow Tld';
            return FALSE;
        }
 
        //Parser la réponse de l'IANA
        $whois_server = self::parse($whois_buf, 'refer');
        if ($whois_server == FALSE) {
            $last_error = 'unknow Whois Server';
            return FALSE;
        }
 
        //Interroger le serveur de Whois
        $whois_buf = self::query_server($whois_server, $domain_name);
        if ($whois_buf == FALSE) {
            $last_error = 'Whois Server seens down';
            return FALSE;
        }
        return $whois_buf;
    }
 
    /**
     * Parser la fiche retournée par l'IANA
     * @param type $buf_whois
     * @param type $tag
     * @return boolean
     */
    private static function parse($buf_whois, $tag) {
        $spos = strpos($buf_whois, $tag . ':');
        if ($spos !== false) {
            $epos = strpos($buf_whois, "\n", $spos + 1);
            $spos+=strlen($tag . ':');
 
            if ($epos !== false) {
                return trim(substr($buf_whois, $spos, $epos - $spos));
            }
        }
        return FALSE;
    }
 
    private static function query_server($server, $domain) {
        /* $ch = curl_init();
          curl_setopt($ch, CURLOPT_URL, $server);
          curl_setopt($ch, CURLOPT_PORT, 43);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
          curl_setopt($ch, CURLOPT_TIMEOUT, self::TIMEOUT_REQUEST);
          curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $domain . "rn");
          $buf = curl_exec($ch);
          curl_close($ch);
          if (strlen($buf) > 10) {
          return $buf;
          } else {
          return FALSE;
          } */
 
        $socket = @fsockopen($server, 43, $errno, $errstr, self::TIMEOUT_REQUEST);
        if ($socket) {
            fputs($socket, $domain . "\r\n");
            $buf = '';
            while (!feof($socket)) {
                $buf.=fgets($socket, 1024);
            }
            fclose($socket);
            if ($errno == 0) {
                return $buf;
            } else {
                return FALSE;
            }
        } else {
            return FALSE;
        }
    }
}
?>

Quelques explications sur la class PHP Whois_DomainName
1. Le chargement du Whois se passe en 3 étapes:
- contacter l'iana pour obtenir le registrar en charge du TLD,
- parser la réponse de l'iana,
- envoyer une requête au registrar pour obtenir le Whois du site internet.
2. La communication avec le serveur de Whois utilise directement un socket sur le port 43. En commentaire, vous trouverez une solution avec cUrl.
3. Si une erreur devait se produire, vous trouverez le détail à l'aide: Whois_DomainName::last_error;

Exemple:
Pour charger le Whois du site Google.fr, utilisez la class PHP Whois_DomainName ainsi:
<?php
echo Whois_DomainName::query('google.fr');
?>

%%
%% This is the AFNIC Whois server.
%%

domain: google.fr
status: ACTIVE
hold: NO
holder-c: GIH6-FRNIC
admin-c: GIH5-FRNIC
tech-c: CP4370-FRNIC
zone-c: NFC1-FRNIC
nsl-id: NSL4386-FRNIC
registrar: MARKMONITOR Inc.
Expiry Date: 30/12/2016
created: 27/07/2000
last-update: 30/12/2015
source: FRNIC

ns-list: NSL4386-FRNIC
nserver: ns1.google.com
nserver: ns2.google.com
nserver: ns3.google.com
nserver: ns4.google.com
source: FRNIC
...


A l'aide du script PHP Whois_DomainName, vous pouvez charger le Whois de tous les noms de domaine quelle que soit l'extension. Cette requête permet de connaitre l'hébergeur ou le propriétaire du site internet.
Pour aller plus, nous vous proposerons prochainement un script qui permet de vérifier si un nom de domaine est disponible à la réservation.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
php5 - class
Mise a jour
14/04/2016
Visualisation
vu 2962 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 261 articles
|BIO_PSEUDO|
Commentaires récents

Publié par robbie dans tuto

marche pas le code le la boite de confirmation
faut-il inclure: { dans le code ou les enlever? merci d'avance pour la reponse (si possible pas par mail merci)

Publié par tactictoe dans CMS

Erreur ligne 8 et 26:
Lire : Reg.OpenKey('\Software\Microsoft\Internet Explorer\Main\', false);
et non pas Reg.OpenKey('SoftwareMicrosoftInternet ExplorerMain', false);

Publié par Fobec dans java

As-tu essaye sans le parametre de la cle ?
(supprimer la ligne url += "&key=" + this.ApiKey;)
A priori, cela fonctionne sans aucune authentification sur l'api ;)

Publié par ghanmitaher dans php5

Bravo! Vous avez deploye des efforts formidables.

Publié par foufou0406 dans CMS

merci !!!