Informations :
Dates
- Publish : : Saturdy 17 october 2020
- Modification : Saturdy 17 october 2020
- 1208 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 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*/ {
028029
var $infoDN = array();
030var $infoNS = array();
031var $infoAutnum = array();
032var $infoIPv4 = array();
033var $infoIPv6 = array();
034 035public $rdap;
036037
public function __construct()
038{
039return $this→rdap;
040041
}
042043
private 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);
050051
if ($contents) return $contents;
052else return FALSE;
053}
054055
private 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);
062063
foreach($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.google
076// Link: https://rdap.markmonitor.com/rdap/domain/dns.google
077078
//echo ''.print_r($bootstrapURL,1).'';
079//echo ''.print_r($bootstrap,1).'';
080081
return $bootstrapURL;
082083
}
084085
private 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);
094095
foreach($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).'';
109110
return $bootstrapURL;
111}
112113
//---------------------------------------------------------------------------------
114115
protected function getInfosAS($request = array()) {
116117
$request['caption'];
118$request['value'];
119120
$request['url'] = 'https://rdap.arin.net/registry/autnum/'.$request['value'];
121122
return $this→getInfosBootstrap($request);
123}
124125
protected function getInfosDN($request = array()) {
126127
$request['caption'];
128$request['value'];
129$request['ext'];
130131
$request['url'] = $this→uriBootstrapTLD($request['ext']).'domain/'.$request['value'];
132133
unset($request['ext']);
134135
return $this→getInfosBootstrap($request);
136}
137138
protected function getInfosNS($request = array()) {
139140
$request['caption'];
141$request['value'];
142$request['ext'];
143144
$request['url'] = $this→uriBootstrapTLD($request['ext']).'nameserver/'.$request['value'];
145146
unset($request['ext']);
147148
return $this→getInfosBootstrap($request);
149}
150151
protected function getInfosIPv4($request = array()) {
152153
$request['caption'];
154$request['value'];
155156
$request['url'] = $this→uriBootstrapIPv4($request['value']).'ip/'.$request['value'];
157158
return $this→getInfosBootstrap($request);
159}
160161
protected 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);
170171
foreach($bootstrapARRAY['services'] as $key => $services)
172$urls[] = $bootstrapARRAY['services'][$key][1][0];
173174
foreach($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);
180181
if(isset($output→handle) && !empty($output→handle))
182break;
183//endif;
184185
endforeach;
186187
$info['url'] = $bootstrapURL;
188$info['output'] = $output;
189190
//echo ''.print_r($bootstrapURL,1).'';
191//echo ''.print_r($bootstrap,1).'';
192193
return $info;
194}
195196
197
private function getInfosBootstrap($request = array()) {
198199
$info = $request;
200201
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']);
205206
}
207208
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).';
209210
return $info;
211}
212213
214
public function getInfos($request) {
215216
$request = trim($request);
217218
//$info['text'] = 'Req ==> ';
219220
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)) {
228229
$infos['caption'] = "IPv4";
230$infos['value'] = $request;
231232
// return
233$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
// return
256$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
// return
276$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';
282283
if(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));
287else
288$request = null;
289290
$infos['value'] = $request;
291292
// return
293$infos = $this→getInfosAS($infos);
294295
}
296else if(
297preg_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) {
309310
$infos['caption'] = 'IPv6';
311312
$infos['value'] = $request;
313314
// return
315$infos = $this→getInfosIPv6($infos);
316317
}
318else $infos['text'] = 'Error - ';
319320
321
return $infos;
322}
323324
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