Publié le 14/04/2016
Auteur Fobec
Réseaux sociaux
0 partages
0 tweets
2 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 1616 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 261 articles
|BIO_PSEUDO|
Commentaires récents

Publié par Sylvio dans tuto

J'ai découvert récemment ElRTE (couplé à  ElFinder) qui a l'air pas mal.

Publié par liomka dans java

Merci! C'étais l'exemple parfait donc j'avais besoin pour apprendre la programmation Client/Serveur en Java ;)

Publié par Altair dans tuto

Bonjour, cette solution fonctionne-t-elle également sur les serveurs mutualisés Amen svp ?

Publié par fobec dans logiciel

MAJ: mise en cache du FAI et optimisation du script de Geolocalisation.

Publié par Outsourcing dans news

Le PageRank n'a plus une reelle importance a mon humble avis mais bcp de mes clients continue a juger de la qualite de ma prestation en referencement avec la barre verte!