Name : BETA-TESTERS
Project name : ZW3B-API-BETA-TESTERS
Authorized. - 200 - Client API Name and Origin Wildcard OK
Class PHP du protocole RDAP (Registration Data Access Protocol) : Infos DN, DNS, ASN, IPv4 et IPv6 - Futur remplaçant du Whois (Qui est ?)
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.
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]
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]
Si cela peut vous servir ;)
NdMoi-même : On peut faire mieux, j'en suis sûr :)
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