Informations :
Dates
- Publish : : Saturdy 17 october 2020
- Modification : Saturdy 17 october 2020
- 1949 views
Download the file(s) :
Share :
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.
- ICANN : Internet Corporation for Assigned Names and Numbers
- RIPE NCC : RIPE Network Coordination Centre
- AFNIC : Association Française pour le Nommage Internet en Coopération
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 System004# --------------------------------------------------------------------005#006# Copyright (c) 2020 by LAB3W : O.Romain Jaillet-ramey - (orj@lab3w.fr)007#008# Date Create : 2020/04/14009# Date Modify : 2020/04/18010#011# Web Site : http://www.lab3w.fr012# Web Site : http://www.lab3w.com013#014# Web Site : http://zw3b.fr015# Web Site : http://zw3b.tv016# Web Site : http://zw3b.site017# Web Site : http://zw3b.net018#019# This module is to manage ---------------------------- :: Descripton020#021# This program is free software. You can redistribute it and/or modify022# it under the terms of the GNU General Public License as published by023# the Free Software Foundation; either version 2 of the License.024######################################################################025 026 027class zw3bRdap /*extends zw3b*/ {028029var $infoDN = array();030var $infoNS = array();031var $infoAutnum = array();032var $infoIPv4 = array();033var $infoIPv6 = array();034 035public $rdap;036037public function __construct()038{039return $this→rdap;040041}042043private function curl_get_file_contents($URL)044{045$c = curl_init();046curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);047curl_setopt($c, CURLOPT_URL, $URL);048$contents = curl_exec($c);049curl_close($c);050051if ($contents) return $contents;052else return FALSE;053}054055private function uriBootstrapTLD($ext = null) {056057$ext = isset($ext) && !empty($ext) ? $ext : 'net';058059$bootstrapTLD = 'https://data.iana.org/rdap/dns.json';060$bootstrapARRAY = $this→curl_get_file_contents($bootstrapTLD);061$bootstrapARRAY = json_decode($bootstrapARRAY, true);062063foreach($bootstrapARRAY['services'] as $key => $services):064//$servs = $services[$key][0][X];065//$bootstrap[$ext]['url'] = $services[$key][1][0];066foreach($services[0] as $clef => $bootstrapTLD):067$bootstrap[$bootstrapTLD]['url'] = $bootstrapARRAY['services'][$key][1][0];068endforeach;069endforeach;070071$bootstrapURL= '';072if(array_key_exists ($ext , $bootstrap ))073$bootstrapURL = $bootstrap[$ext]['url'];074075// Link: https://www.registry.google/rdap/domain/dns.google076// Link: https://rdap.markmonitor.com/rdap/domain/dns.google077078//echo ''.print_r($bootstrapURL,1).'';079//echo ''.print_r($bootstrap,1).'';080081return $bootstrapURL;082083}084085private function uriBootstrapIPv4($ipv4 = null) {086087$ipv4 = isset($ipv4) && !empty($ipv4) ? $ipv4 : '';088$ipv4BlOCK = strstr($ipv4, '.', true);089$ipv4BlOCK = $ipv4BlOCK.'.0.0.0';090091$bootstrapIPv4 = 'https://data.iana.org/rdap/ipv4.json';092$bootstrapARRAY = $this→curl_get_file_contents($bootstrapIPv4);093$bootstrapARRAY = json_decode($bootstrapARRAY, true);094095foreach($bootstrapARRAY['services'] as $key => $services):096foreach($services[0] as $clef => $bootstrapIPv4):097$bootstrapIPv4 = explode('/', $bootstrapIPv4);098$bootstrapIPv4 = $bootstrapIPv4[0];099$bootstrap[$bootstrapIPv4]['url'] = $bootstrapARRAY['services'][$key][1][0];100endforeach;101endforeach;102103$bootstrapURL= '';104if(array_key_exists ($ipv4BlOCK , $bootstrap ))105$bootstrapURL = $bootstrap[$ipv4BlOCK]['url'];106107//echo ''.print_r($bootstrapURL,1).'';108//echo ''.print_r($bootstrap,1).'';109110return $bootstrapURL;111}112113//---------------------------------------------------------------------------------114115protected function getInfosAS($request = array()) {116117$request['caption'];118$request['value'];119120$request['url'] = 'https://rdap.arin.net/registry/autnum/'.$request['value'];121122return $this→getInfosBootstrap($request);123}124125protected function getInfosDN($request = array()) {126127$request['caption'];128$request['value'];129$request['ext'];130131$request['url'] = $this→uriBootstrapTLD($request['ext']).'domain/'.$request['value'];132133unset($request['ext']);134135return $this→getInfosBootstrap($request);136}137138protected function getInfosNS($request = array()) {139140$request['caption'];141$request['value'];142$request['ext'];143144$request['url'] = $this→uriBootstrapTLD($request['ext']).'nameserver/'.$request['value'];145146unset($request['ext']);147148return $this→getInfosBootstrap($request);149}150151protected function getInfosIPv4($request = array()) {152153$request['caption'];154$request['value'];155156$request['url'] = $this→uriBootstrapIPv4($request['value']).'ip/'.$request['value'];157158return $this→getInfosBootstrap($request);159}160161protected function getInfosIPv6($request = array()) {162163$info = $request;164165$ipv6 = isset($request['value']) && !empty($request['value']) ? $request['value'] : ''; // == 2607:5300:0060:9389::166167$bootstrapIPv6 = 'https://data.iana.org/rdap/ipv6.json';168$bootstrapARRAY = $this→curl_get_file_contents($bootstrapIPv6);169$bootstrapARRAY = json_decode($bootstrapARRAY, true);170171foreach($bootstrapARRAY['services'] as $key => $services)172$urls[] = $bootstrapARRAY['services'][$key][1][0];173174foreach($urls as $key => $uri):175//if($key == 2):176$bootstrapURL = $uri.'ip/'.$ipv6;177178$output = $this→curl_get_file_contents($bootstrapURL);179$output = json_decode($output);180181if(isset($output→handle) && !empty($output→handle))182break;183//endif;184185endforeach;186187$info['url'] = $bootstrapURL;188$info['output'] = $output;189190//echo ''.print_r($bootstrapURL,1).'';191//echo ''.print_r($bootstrap,1).'';192193return $info;194}195196197private function getInfosBootstrap($request = array()) {198199$info = $request;200201if(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']);205206}207208if(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).';209210return $info;211}212213214public function getInfos($request) {215216$request = trim($request);217218//$info['text'] = 'Req ==> ';219220if( preg_match(221'#A'222.'[0-9]{1,3}.+' // 192223.'[0-9]{1,3}.+' // 168224.'[0-9]{1,3}.+' // 10225.'[0-9]{1,3}'// 1226.'z#'227, $request)) {228229$infos['caption'] = "IPv4";230$infos['value'] = $request;231232// return233$infos = $this→getInfosIPv4($infos);234235}236else if( preg_match(237'#A'238.'[a-zA-Z0-9-]+'239.'.'240.'(?:(asso.)|(gouv.))?'241.'[a-zA-Z]{2,}'242.'z#'243, $request)244) {245246$infos['caption'] = 'DN';247$infos['value'] = $request;248249$ext = strrchr($request, '.');250$ext = substr($ext, 1, strlen($ext));251$ext = strToLower($ext);252253$infos['ext'] = $ext;254255// return256$infos = $this→getInfosDN($infos);257258}259else if(substr_count($request, '.') >= '2' &&260preg_match('#A[a-zA-Z0-9-.]{8,}?.?z#', $request)261) {262263$infos['caption'] = 'DNS';264265$request = preg_match('#A[a-zA-Z0-9-.]{8,}.z#', $request) ? substr($request, 0, strlen($request)-1) : $request;266267$infos['value'] = $request;268269$ext = strrchr($request, '.');270$ext = substr($ext, 1, strlen($ext));271$ext = strToLower($ext);272273$infos['ext'] = $ext;274275// return276$infos = $this→getInfosNS($infos);277278}279else if(strlen($request) >= '3' && preg_match('#A(?:(?i)(AS)|ASN)+[0-9]{1,}z#', $request) ) {280281$infos['caption'] = 'ASN';282283if(substr($request, 0, 3) == 'ASN')284$request = substr($request, 3, strlen($request));285elseif(substr($request, 0, 2) == 'AS')286$request = substr($request, 2, strlen($request));287else288$request = null;289290$infos['value'] = $request;291292// return293$infos = $this→getInfosAS($infos);294295}296else if(297preg_match('#[a-fA-F0-9:]#', $request) && strstr($request, ':') && strlen($request) >= 10 && strlen($request) <= 39298&& (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::0001302|| (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::1234304|| (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) {309310$infos['caption'] = 'IPv6';311312$infos['value'] = $request;313314// return315$infos = $this→getInfosIPv6($infos);316317}318else $infos['text'] = 'Error - ';319320321return $infos;322}323324325}326[/php]
Et on fait la demande de renseignement comme suit :
Script avec 15 lignes
001[php]002# Pour afficher les informations au format PHP003 004$request = 'zw3b.net'; # Domain Name005$request = 'dns.ipv10.net'; # Domain Name Service006$request = 'AS1'; # Autonomous System Number007$request = '158.69.126.137'; # IPv4008$request = '2607:5300:60:9389:15:1:0:1'; # IPv6009 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



