ZW3B :-: API Client * Contents * Docs by LAB3W.ORJ

Translate this page

Name : BETA-TESTERS

Project name : ZW3B-API-BETA-TESTERS

Authorized. - 200 - Client API Name and Origin Wildcard OK

¿Comment? 'Ou' ¿Que faire?, Développement, PHP, RDAP - Registration Data Access Protocol (class PHP)

Class PHP du protocole RDAP (Registration Data Access Protocol) : Infos DN, DNS, ASN, IPv4 et IPv6 - Futur remplaçant du Whois (Qui est ?)

Author : O.Romain.Jaillet-ramey - lab3w (dot) orj (at) zw3b (dot) fr

Un RIR est un Registre Internet Régional , un organisme qui alloue les blocs d'adresses IP et des numéros d'Autonomous System dans sa zone géographique.

Le Registration Data Access Protocol est un protocole de communication réseau informatique normalisé par un groupe de travail de l'IETF (Internet Engineering Task Force ) en 2015, aprés des développements expérimentaux et des discussions approfondies. C'est un successeur du protocole WHOIS, utilisé pour rechercher des données d'enregistrement pertinentes à partir de ressources Internet telles que les noms de domaine, les adresses IP et les numéros de système autonome.

Alors que WHOIS récupère essentiellement du texte libre, RDAP fournit des données dans un format JSON standard lisible par machine. Afin d'atteindre cet objectif, la sortie de tous les serveurs WHOIS opérationnels a été analysée, en effectuant un recensement des étiquettes qu'ils utilisaient. Les concepteurs de RDAP, dont beaucoup sont membres de registres de numéros ou de noms, se sont efforcés de garder le protocole aussi simple que possible, car la complexité était considérée comme l'une des raisons pour lesquelles les tentatives précédentes, telles que CRISP, ont échoué. RDAP est basé sur des services Web RESTful, de sorte que les codes d'erreur, l'identification de l'utilisateur, l'authentification et le contrôle d'accès peuvent être fournis via HTTP.

Le plus grand retard dans la réalisation de RDAP s'est avéré être le bootstrap, déterminant où se trouve le serveur pour chaque domaine de premier niveau, plage d'adresses IP ou plage ASN. L'IANA a accepté d'héberger les informations de bootstrap dans des registres appropriés et de les publier à un emplacement bien connu URL au format JSON. Ces registres ont commencé vides et seront progressivement peuplés au fur et à mesure que les registrants de domaines et d'espaces d'adresse fourniront des informations sur le serveur RDAP à l'IANA . Pour les registres de numéros, ARIN a mis en place un service RDAP public qui comporte également une URL d'amorçage, similaire à ce qu'ils font pour WHOIS. Pour les registres de noms, l'ICANN exige la conformité RDAP depuis 2013.

Class PHP RDAP créée par LAB3W .ORJ

J'ai fais une class PHP RDAP pour utiliser et vérifier les informations sur les noms de domaine, les DNS, les ASN, les IPv4 et IPv6.

Script avec 326 lignes

001[php]
002######################################################################
003# ZW3B.Site v7.1.0 : The Web Sites Management System
004# --------------------------------------------------------------------
005#
006# Copyright (c) 2020 by LAB3W : O.Romain Jaillet-ramey - (orj@lab3w.fr)
007#
008# Date Create : 2020/04/14
009# Date Modify : 2020/04/18
010#
011# Web Site : http://www.lab3w.fr
012# Web Site : http://www.lab3w.com
013#
014# Web Site : http://zw3b.fr
015# Web Site : http://zw3b.tv
016# Web Site : http://zw3b.site
017# Web Site : http://zw3b.net
018#
019# This module is to manage ---------------------------- :: Descripton
020#
021# This program is free software. You can redistribute it and/or modify
022# it under the terms of the GNU General Public License as published by
023# the Free Software Foundation; either version 2 of the License.
024######################################################################
025
026
027class zw3bRdap /*extends zw3b*/ {
028    
029    var $infoDN = array();
030    var $infoNS = array();
031    var $infoAutnum = array();
032    var $infoIPv4 = array();
033    var $infoIPv6 = array();
034
035    public $rdap;
036    
037    public function __construct()
038    {
039        return $this->rdap;
040        
041    }
042    
043    private function curl_get_file_contents($URL)
044    {
045        $c = curl_init();
046        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
047        curl_setopt($c, CURLOPT_URL, $URL);
048        $contents = curl_exec($c);
049        curl_close($c);
050        
051        if ($contents) return $contents;
052        else return FALSE;
053    }
054    
055    private function uriBootstrapTLD($ext = null) {
056        
057        $ext = isset($ext) && !empty($ext) ? $ext : 'net';
058        
059        $bootstrapTLD = 'https://data.iana.org/rdap/dns.json';
060        $bootstrapARRAY = $this->curl_get_file_contents($bootstrapTLD);
061        $bootstrapARRAY = json_decode($bootstrapARRAY, true);
062        
063        foreach($bootstrapARRAY['services'] as $key => $services):
064        //$servs = $services[$key][0][X];
065        //$bootstrap[$ext]['url'] = $services[$key][1][0];
066        foreach($services[0] as $clef => $bootstrapTLD):
067        $bootstrap[$bootstrapTLD]['url']  = $bootstrapARRAY['services'][$key][1][0];
068        endforeach;
069        endforeach;
070        
071        $bootstrapURL= '';
072        if(array_key_exists ($ext , $bootstrap ))
073            $bootstrapURL = $bootstrap[$ext]['url'];
074            
075            // Link: https://www.registry.google/rdap/domain/dns.google
076            // Link: https://rdap.markmonitor.com/rdap/domain/dns.google
077            
078            //echo ''.print_r($bootstrapURL,1).'';
079            //echo ''.print_r($bootstrap,1).'';
080            
081            return $bootstrapURL;
082            
083    }
084    
085    private function uriBootstrapIPv4($ipv4 = null) {
086        
087        $ipv4 = isset($ipv4) && !empty($ipv4) ? $ipv4 : '';
088        $ipv4BlOCK = strstr($ipv4, '.', true);
089        $ipv4BlOCK = $ipv4BlOCK.'.0.0.0';
090        
091        $bootstrapIPv4 = 'https://data.iana.org/rdap/ipv4.json';
092        $bootstrapARRAY = $this->curl_get_file_contents($bootstrapIPv4);
093        $bootstrapARRAY = json_decode($bootstrapARRAY, true);
094        
095        foreach($bootstrapARRAY['services'] as $key => $services):
096        foreach($services[0] as $clef => $bootstrapIPv4):
097        $bootstrapIPv4 = explode('/', $bootstrapIPv4);
098        $bootstrapIPv4 = $bootstrapIPv4[0];
099        $bootstrap[$bootstrapIPv4]['url']  = $bootstrapARRAY['services'][$key][1][0];
100        endforeach;
101        endforeach;
102        
103        $bootstrapURL= '';
104        if(array_key_exists ($ipv4BlOCK , $bootstrap ))
105            $bootstrapURL = $bootstrap[$ipv4BlOCK]['url'];
106            
107            //echo ''.print_r($bootstrapURL,1).'';
108            //echo ''.print_r($bootstrap,1).'';
109            
110            return $bootstrapURL;
111    }
112    
113    //---------------------------------------------------------------------------------
114    
115    protected function getInfosAS($request = array()) {
116        
117        $request['caption'];
118        $request['value'];
119        
120        $request['url'] = 'https://rdap.arin.net/registry/autnum/'.$request['value'];
121        
122        return $this->getInfosBootstrap($request);
123    }
124    
125    protected function getInfosDN($request = array()) {
126        
127        $request['caption'];
128        $request['value'];
129        $request['ext'];
130        
131        $request['url'] = $this->uriBootstrapTLD($request['ext']).'domain/'.$request['value'];
132        
133        unset($request['ext']);
134        
135        return $this->getInfosBootstrap($request);
136    }
137    
138    protected function getInfosNS($request = array()) {
139        
140        $request['caption'];
141        $request['value'];
142        $request['ext'];
143        
144        $request['url'] = $this->uriBootstrapTLD($request['ext']).'nameserver/'.$request['value'];
145        
146        unset($request['ext']);
147        
148        return $this->getInfosBootstrap($request);
149    }
150    
151    protected function getInfosIPv4($request = array()) {
152        
153        $request['caption'];
154        $request['value'];
155        
156        $request['url'] = $this->uriBootstrapIPv4($request['value']).'ip/'.$request['value'];
157        
158        return $this->getInfosBootstrap($request);
159    }
160    
161    protected function getInfosIPv6($request = array()) {
162        
163        $info = $request;
164        
165        $ipv6 = isset($request['value']) && !empty($request['value']) ? $request['value'] : ''; // == 2607:5300:0060:9389::
166        
167        $bootstrapIPv6 = 'https://data.iana.org/rdap/ipv6.json';
168        $bootstrapARRAY = $this->curl_get_file_contents($bootstrapIPv6);
169        $bootstrapARRAY = json_decode($bootstrapARRAY, true);
170        
171        foreach($bootstrapARRAY['services'] as $key => $services)
172            $urls[] = $bootstrapARRAY['services'][$key][1][0];
173            
174            foreach($urls as $key => $uri):
175            //if($key == 2):
176            $bootstrapURL = $uri.'ip/'.$ipv6;
177            
178            $output = $this->curl_get_file_contents($bootstrapURL);
179            $output = json_decode($output);
180            
181            if(isset($output->handle) && !empty($output->handle))
182                break;
183                //endif;
184                
185                endforeach;
186                
187                $info['url'] = $bootstrapURL;
188                $info['output'] = $output;
189                
190                //echo ''.print_r($bootstrapURL,1).'';
191                //echo ''.print_r($bootstrap,1).'';
192                
193                return $info;
194    }
195    
196    
197    private function getInfosBootstrap($request = array()) {
198        
199        $info = $request;
200        
201        if(isset($request['url']) && !empty($request['url'])) {
202            //$output = shell_exec('curl '.$url);
203            $info['output'] = $this->curl_get_file_contents($request['url']);
204            $info['output'] = json_decode($info['output']);
205            
206        }
207        
208        if(empty($info['output']) && !empty($request['url'])) $info['text'] = ' ==> Réponse vide ('.$request['url'].') : soit le numéro d'<acronym  title="Autonomous System" lang="EN">AS</acronym>, soit l'adresse <acronym  title="Internet Protocol" lang="EN">IP</acronym>, soit le Serveur de Nom (<acronym  title="Name Server" lang="EN">NS</acronym>), soit le Nom de Domaine (<acronym  title="Domain Name" lang="EN">DN</acronym>) est inconnu ou protégé (extension de noms de domaine de pays).';
209        
210        return $info;
211    }
212    
213    
214    public function getInfos($request) {
215        
216        $request = trim($request);
217        
218        //$info['text'] = 'Req ==> ';
219        
220        if( preg_match(
221            '#A'
222            .'[0-9]{1,3}.+' // 192
223            .'[0-9]{1,3}.+' // 168
224            .'[0-9]{1,3}.+' // 10
225            .'[0-9]{1,3}'// 1
226            .'z#'
227            , $request)) {
228                
229                $infos['caption'] = "IPv4";
230                $infos['value'] = $request;
231                
232                // return
233                $infos = $this->getInfosIPv4($infos);
234                
235            }
236            else if( preg_match(
237                '#A'
238                .'[a-zA-Z0-9-]+'
239                .'.'
240                .'(?:(asso.)|(gouv.))?'
241                .'[a-zA-Z]{2,}'
242                .'z#'
243                , $request)
244                ) {
245                    
246                    $infos['caption'] = 'DN';
247                    $infos['value'] = $request;
248                    
249                    $ext = strrchr($request, '.');
250                    $ext = substr($ext, 1, strlen($ext));
251                    $ext = strToLower($ext);
252                    
253                    $infos['ext'] = $ext;
254                    
255                    // return
256                    $infos = $this->getInfosDN($infos);
257                    
258                }
259                else if(substr_count($request, '.') >= '2' &&
260                    preg_match('#A[a-zA-Z0-9-.]{8,}?.?z#', $request)
261                    ) {
262                        
263                        $infos['caption'] = 'DNS';
264                        
265                        $request = preg_match('#A[a-zA-Z0-9-.]{8,}.z#', $request) ? substr($request, 0, strlen($request)-1)  : $request;
266                        
267                        $infos['value'] = $request;
268                        
269                        $ext = strrchr($request, '.');
270                        $ext = substr($ext, 1, strlen($ext));
271                        $ext = strToLower($ext);
272                        
273                        $infos['ext'] = $ext;
274                        
275                        // return
276                        $infos = $this->getInfosNS($infos);
277                        
278                    }
279                    else if(strlen($request) >= '3' && preg_match('#A(?:(?i)(AS)|ASN)+[0-9]{1,}z#', $request) ) {
280                        
281                        $infos['caption'] = 'ASN';
282                        
283                        if(substr($request, 0, 3) == 'ASN')
284                            $request = substr($request, 3, strlen($request));
285                            elseif(substr($request, 0, 2) == 'AS')
286                            $request = substr($request, 2, strlen($request));
287                            else
288                                $request = null;
289                                
290                                $infos['value'] = $request;
291                                
292                                // return
293                                $infos = $this->getInfosAS($infos);
294                                
295                    }
296                    else if(
297                        preg_match('#[a-fA-F0-9:]#', $request) && strstr($request, ':') && strlen($request) >= 10 && strlen($request) <= 39
298                        && (
299                            // TODO : A TRUE EREG DETECT IPV6 ;) ^^
300                            //(substr_count($request, ':') == '2' && strlen($request) >= 6  && strlen($request) <= 10)
301                            (substr_count($request, ':') == '3' && strlen($request) >= 10 && strlen($request) <= 15) // 2001:0bc8::0001
302                            || (substr_count($request, ':') == '4' && strlen($request) >= 11  && strlen($request) <= 26) // 2001:bc8:25bb::
303                            || (substr_count($request, ':') == '5' && strlen($request) >= 11  && strlen($request) <= 31) // 2001:0bc8:1:ff00::1234
304                            || (substr_count($request, ':') == '6' && strlen($request) >= 11  && strlen($request) <= 36) // 2001:bc8:1:0:1::
305                            || (substr_count($request, ':') == '7' && strlen($request) >= 13  && strlen($request) <= 39) // 2001:bc8:1:0:1:2::
306                            || (substr_count($request, ':') == '8' && strlen($request) >= 13  && strlen($request) <= 35 && preg_match('#:z#', $request)) // 2001:bc8:1:0:1:2::
307                            )
308                        ) {
309                            
310                            $infos['caption'] = 'IPv6';
311                            
312                            $infos['value'] = $request;
313                            
314                            // return
315                            $infos = $this->getInfosIPv6($infos);
316                            
317                        }
318                        else $infos['text'] = 'Error - ';
319                        
320                        
321                        return $infos;
322    }
323    
324    
325}
326[/php]
Retirer les numéros de lignes

Et on fait la demande de renseignement comme suit :

Script avec 15 lignes

001[php]
002# Pour afficher les informations au format PHP
003
004$request = 'zw3b.net'; # Domain Name
005$request = 'dns.ipv10.net'; # Domain Name Service
006$request = 'AS1'; # Autonomous System Number
007$request = '158.69.126.137'; # IPv4
008$request = '2607:5300:60:9389:15:1:0:1'; # IPv6
009
010$rdap = new zw3bRdap();
011$infos = $rdap->getInfos($request);
012
013echo ''.print_r($infos, 1).'';
014
015[/php]
Retirer les numéros de lignes

Si cela peut vous servir ;)

NdMoi-même : On peut faire mieux, j'en suis sûr :)

Vous pouvez la sortie d'écran de cette classe PHP par ici : LAB3W : Admin - Rdap

Je précise que les extensions de noms de domaine de pays sont innacessibles pour les personnes, entitées, sites non autorisés (pour le grand public) - Certaines informations sont cachées si vous n'êtes pas une autoritée compétentes.


Voir le projet OpenRDAP , un/le client en ligne de commande pour le protocole d'accès aux données d'enregistrement, écrit en Go .


Cordialement,
Romain