This method has no error handling, it simply puts out "false" and it is impossible to check for NXDOMAIN, SERVFAIL, TIMEOUT or any other error...
(PHP 5, PHP 7, PHP 8)
dns_get_record — Lit les données DNS associées à un hôte
$hostname
,$type
= DNS_ANY
,&$authoritative_name_servers
= null
,&$additional_records
= null
,$raw
= false
Lit les données DNS associées à l'hôte
hostname
.
hostname
hostname
doit être un nom d'hôte DNS valide, comme
www.example.com
. Des résolutions inversées peuvent
être faites avec la notation in-addr.arpa
, mais la fonction
gethostbyaddr() est plus efficace pour faire des
résolutions inverses.
Note:
En terme de standards DNS, les adresses email sont données au format
utilisateur.hote
(par exemple :webmestre.example.com
au contraire du formatwebmestre@example.com
). N'oubliez pas de vérifier cette adresse et de la modifier si nécessaire avant de la passer à la fonction mail().
type
Par défaut, dns_get_record() va rechercher toutes les
ressources associées à hostname
. Pour limiter la
taille de la requête, le paramètre optionnel type
peut prendre l'une des valeurs constantes suivantes :
DNS_A
, DNS_CNAME
,
DNS_HINFO
, DNS_CAA
,
DNS_MX
, DNS_NS
,
DNS_PTR
, DNS_SOA
,
DNS_TXT
, DNS_AAAA
,
DNS_SRV
, DNS_NAPTR
,
DNS_A6
, DNS_ALL
ou DNS_ANY
.
Note:
À cause des performances excentriques de la bibliothèque libresolv, suivant les plates-formes,
DNS_ANY
ne retournera pas toujours tous les enregistrements, et l'optionDNS_ALL
, bien que plus lente, le fera de manière plus sûre.
Note:
Windows :
DNS_CAA
n'est pas supporté. Support pourDNS_A6
n'est pas implémenté.
authoritative_name_servers
Passé par référence, et, s'il est fourni, recevra les enregistrements de ressources pour les Authoritative Name Servers.
additional_records
Passé par référence, et, s'il est fourni, recevra tous les enregistrements supplémentaires.
raw
Le type
sera interprété comme un ID de type DNS brut
(les constantes DNS_*
ne peuvent pas être utilisé).
La valeur de retour contiendra une clé data
,
qui doit être manuellement analysé.
dns_get_record() retourne un tableau de tableaux
associatifs, ou false
si une erreur survient.
Chaque tableau contient au minimum les index suivants :
Attribut | Signification |
---|---|
host | L'enregistrement de l'espace de nom DNS qui est décrit par les autres données. |
class |
dns_get_record() ne retourne que la classe d'enregistrement
Internet et, en tant que tel, cet index vaudra toujours IN .
|
type | Chaîne de caractères contenant le type d'enregistrement. Des attributs supplémentaires seront aussi disponibles dans le tableau suivant la valeur de ce type. Reportez-vous à la table ci-dessous. |
ttl |
"Time To Live" : durée avant expiration de l'enregistrement.
Cette valeur est différente de la durée avant expiration originale,
mais plutôt cette valeur moins la durée depuis la dernière interrogation
du serveur DNS responsable.
|
Type | Valeur supplémentaire |
---|---|
A |
ip : une adresse IPv4, au format numérique.
|
MX |
pri : priorité du serveur de mail.
Les nombres faibles indiquent une priorité importante.
target : FQDN du serveur de mail.
Voir aussi dns_get_mx().
|
CNAME |
target : FQDN du nom de l'espace DNS qui sert
d'alias à cet enregistrement.
|
NS |
target : FQDN du nom de serveur qui est responsable
de ce nom de domaine.
|
PTR |
target : nom de domaine vers lequel cet enregistrement pointe.
|
TXT |
txt : chaîne de caractères arbitrairement associée
à cet enregistrement.
|
HINFO |
cpu : numéro IANA désignant le processeur de la machine
référencée par cet enregistrement.
os : numéro IANA désignant le système d'exploitation
de la machine référencée par cet enregistrement.
Voir » Operating System Names
pour connaître la signification de ces valeurs.
|
CAA |
flags : Un champ-bit d'un octet : actuellement seul le bit 0 est définit,
signifiant 'critical' (critique) ; les autres bits sont réservés et devrait être ignoré.
tag : Le nom du tag CAA (chaîne alphanumérique ASCII).
value : La valeur du tag CAA (chaîne binaire, peut utiliser des sous-formats).
Pour plus d'informations voir : » RFC 6844
|
SOA |
mname : FQDN de la source de cet enregistrement.
rname : adresse email du contact administratif de
ce domaine.
serial : numéro de série du nom de domaine.
refresh : intervalle de rafraîchissement (en secondes)
que les serveurs de noms secondaires doivent utiliser pour mettre
en cache ce nom de domaine.
retry : durée (en secondes) d'attente après un rafraîchissement
échoué, avant de faire une seconde tentative.
expire : durée maximale (en secondes) de conservation
d'une copie des données de zone sans pouvoir faire de rafraîchissement.
minimum-ttl : durée minimale (en secondes) pendant laquelle un
client conserve des données de zone avant qu'il ne soumette une nouvelle
requête. Cette configuration peut être annulée par d'autres enregistrements.
|
AAAA |
ipv6 : adresse IPv6
|
A6 |
masklen : longueur (en octets) à hériter depuis
la cible spécifiée par chain .
ipv6 : adresse pour que cet enregistrement spécifique fusionne
avec chain .
chain : l'enregistrement parent à fusionner avec les données
ipv6 .
|
SRV |
pri : (priorité) les priorités les plus basses doivent
être utilisées en premier.
weight : classement pour choisir aléatoirement parmi les
serveurs targets .
target et port : nom d'hôte et
port où le service est disponible.
Pour plus d'informations, voir : » RFC 2782
|
NAPTR |
order et pref : équivalent à
pri et weight ci-dessus.
flags , services , regex ,
et replacement : paramètres tels que définis
dans la » RFC 2915.
|
Version | Description |
---|---|
7.0.16, 7.1.2 | Ajout du support pour les enregistrements de type CAA. |
Exemple #1 Exemple avec dns_get_record()
<?php
$result = dns_get_record("php.net");
print_r($result);
?>
Résultat de l'exemple ci-dessus est similaire à :
Array ( [0] => Array ( [host] => php.net [type] => MX [pri] => 5 [target] => pair2.php.net [class] => IN [ttl] => 6765 ) [1] => Array ( [host] => php.net [type] => A [ip] => 64.246.30.37 [class] => IN [ttl] => 8125 ) )
Exemple #2 Exemple avec dns_get_record() et DNS_ANY
Comme il est très courant de rechercher l'IP d'un serveur,
une fois que le champ MX a été résolu, dns_get_record()
retournera aussi un tableau dans le paramètre additional_records
qui contiendra les enregistrements associés. authoritative_name_servers
est aussi retourné en contenant une liste des serveurs autorité.
<?php
/* Demande tous ("ANY") les enregistrements pour php.net,
puis crée les tableaus $authns et $addtl
contenant une liste des noms de serveurs, et tous
les enregistrements qui vont avec
*/
$result = dns_get_record("php.net", DNS_ANY, $authns, $addtl);
echo "Result = ";
print_r($result);
echo "Auth NS = ";
print_r($authns);
echo "Additional = ";
print_r($addtl);
?>
Résultat de l'exemple ci-dessus est similaire à :
Result = Array ( [0] => Array ( [host] => php.net [type] => MX [pri] => 5 [target] => pair2.php.net [class] => IN [ttl] => 6765 ) [1] => Array ( [host] => php.net [type] => A [ip] => 64.246.30.37 [class] => IN [ttl] => 8125 ) ) Auth NS = Array ( [0] => Array ( [host] => php.net [type] => NS [target] => remote1.easydns.com [class] => IN [ttl] => 10722 ) [1] => Array ( [host] => php.net [type] => NS [target] => remote2.easydns.com [class] => IN [ttl] => 10722 ) [2] => Array ( [host] => php.net [type] => NS [target] => ns1.easydns.com [class] => IN [ttl] => 10722 ) [3] => Array ( [host] => php.net [type] => NS [target] => ns2.easydns.com [class] => IN [ttl] => 10722 ) ) Additional = Array ( [0] => Array ( [host] => pair2.php.net [type] => A [ip] => 216.92.131.5 [class] => IN [ttl] => 6766 ) [1] => Array ( [host] => remote1.easydns.com [type] => A [ip] => 64.39.29.212 [class] => IN [ttl] => 100384 ) [2] => Array ( [host] => remote2.easydns.com [type] => A [ip] => 212.100.224.80 [class] => IN [ttl] => 81241 ) [3] => Array ( [host] => ns1.easydns.com [type] => A [ip] => 216.220.40.243 [class] => IN [ttl] => 81241 ) [4] => Array ( [host] => ns2.easydns.com [type] => A [ip] => 216.220.40.244 [class] => IN [ttl] => 81241 ) )
This method has no error handling, it simply puts out "false" and it is impossible to check for NXDOMAIN, SERVFAIL, TIMEOUT or any other error...
You might have the same problem as me, where testing a non-existent domain will search for a subdomain relative to the domain you are executing from, for example:
// Test with working domain
var_dump( dns_get_record('google.com', DNS_A) );
/* works, returns
Array
(
[host] => google.com
[class] => IN
[ttl] => 299
[type] => A
[ip] => 172.217.12.142
)
*/
// Test with invalid domain on our website (example.com)
var_dump( dns_get_record('invalidtestingname.com', DNS_A) );
/* Doesn't work, pretend it's a subdomain
Array
(
[host] => invalidtestingname.com.example.com
[class] => IN
[ttl] => 299
[type] => A
[ip] => xxx.xxx.xxx.xxx
)
*/
If anyone has that problem, add a "dot" at the end of the domain name, for example, instead of
dns_get_record('invalidtestingname.com', DNS_A);
Do this:
dns_get_record('invalidtestingname.com.', DNS_A);
Get more than one type at once like this:
<?php
$dnsr = dns_get_record('php.net', DNS_A + DNS_NS);
print_r($dnsr);
?>
Using DNS_ALL fails on some domains where DNS_ANY works. I noticed the function getting stuck on the DNS_PTR record, which caused it to return FALSE with this error:
PHP Warning: dns_get_record(): res_nsend() failed in ....
This gets all records except DNS_PTR:
<?php
$dnsr = dns_get_record('php.net', DNS_ALL - DNS_PTR);
print_r($dnsr);
?>
Although this works very well for general DNS queries if you want to do a direct DNS query to a specified DNS server (rather than using OS resolution) try PHPDNS: http://www.purplepixie.org/phpdns/
You can do direct (TCP or UDP) low-level queries to a nameserver and recurse at will. Very useful for testing specific servers and also for walking through a recursive resolution.
Please note that Firewalls and anti malware software detects (and depending on company policies even blocks) DNS_ANY requests.
In that case the usage of this function fails.
This is because DNS_ANY requests can be exploited for creating "amplification (D)DOS attackes": You send 1 DNS_ANY request and get a huge amount of information back, thus even small requests can result into hugh network load.
I advise to use a more explicit name-request instead of using DNS_ANY.
When I use DNS_ALL as the second parameter to invoke dns_get_record() on the OS of Windows, PHP emits a warning with the message "Warning: dns_get_record(): Type '251721779' not supported in blah.php on line blah", and DNS_ANY is always OKAY.
Sadly this method does not allow for using an arbitrary nameserver.
If you need to make a request using a specific DNS server, you'll need to use either Pear/Net_DNS2, or libdns ( https://github.com/DaveRandom/LibDNS ).
If you want something shorter and lighter, you can also use this 150 lines function: https://gist.github.com/bohwaz/ddc61c4f7e031c3221a89981e70b830c
There's a comment below from 7 years ago regarding BSD and MacOSX, I'd just like to follow up incase some people see that and don't think it'll work on MacOSX.
Software:
System Software Overview:
System Version: OS X 10.8.3 (12D78)
Kernel Version: Darwin 12.3.0
Boot Volume: Macintosh HD
Boot Mode: Normal
Computer Name: Karl’s iMac
User Name: Karl Kloppenborg (karl)
Secure Virtual Memory: Enabled
Time since boot: 10 days 20:24
--------------
# php -a
php > print_r(dns_get_record('google.com', DNS_MX));
Array
(
[0] => Array
(
[host] => google.com
[type] => MX
[pri] => 10
[target] => aspmx.l.google.com
[class] => IN
[ttl] => 749
)
[1] => Array
(
[host] => google.com
[type] => MX
[pri] => 30
[target] => alt2.aspmx.l.google.com
[class] => IN
[ttl] => 749
)
[2] => Array
(
[host] => google.com
[type] => MX
[pri] => 50
[target] => alt4.aspmx.l.google.com
[class] => IN
[ttl] => 749
)
[3] => Array
(
[host] => google.com
[type] => MX
[pri] => 40
[target] => alt3.aspmx.l.google.com
[class] => IN
[ttl] => 749
)
[4] => Array
(
[host] => google.com
[type] => MX
[pri] => 20
[target] => alt1.aspmx.l.google.com
[class] => IN
[ttl] => 749
)
)