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 1129 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 261 articles
|BIO_PSEUDO|
Commentaires récents

Publié par Christophe dans CMS

en remplacant la ligne:
SHGetFileInfo(PChar(ePath.Text + SearchRec.Name), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON);
par la ligne
SHGetFileInfo(PChar(ePath.Text + Sear...

Publié par Fobec dans CMS

Le code source de l'exemple se trouve dans la pièce jointe (Fiche de l'article -> Boutton Telecharger)

Publié par leflo dans php5

Bonjour
Sans parler du fait que l'IP peut ne pas vouloir dire grand chose, en cas de proxy/translation comment on fait? On voit pas et on interdit tout meme si l'utilisateur n'est pas responsa...

Publié par samir dans CMS

merci

Publié par options binaires dans php5

genial l'outil ! merci