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 — Lee los datos DNS asociados a un host
$hostname
,$type
= DNS_ANY
,&$authoritative_name_servers
= null
,&$additional_records
= null
,$raw
= false
Lee los datos DNS asociados al host hostname
.
hostname
hostname
debe ser un nombre de host DNS válido, como
www.example.com
. Las resoluciones inversas pueden
realizarse con la notación in-addr.arpa
, pero la función
gethostbyaddr() es más eficiente para realizar resoluciones inversas.
Nota:
En términos de estándares DNS, las direcciones de correo electrónico se proporcionan en el formato
usuario.host
(por ejemplo:webmaster.example.com
en lugar del formatowebmaster@example.com
). No se debe olvidar verificar esta dirección y modificarla si es necesario antes de pasarla a la función mail().
type
Por omisión, dns_get_record() buscará todos los
recursos asociados a hostname
.
Para limitar la consulta, se debe utilizar una de las constantes
DNS_*
.
authoritative_name_servers
Pasado por referencia, y, si se proporciona, recibirá los registros de recursos para los Authoritative Name Servers.
additional_records
Pasado por referencia, y, si se proporciona, recibirá todos los registros adicionales.
raw
El type
será interpretado como un ID de tipo DNS sin tratar
(no se pueden utilizar las constantes DNS_*
).
El valor de retorno contendrá una clave data
,
que debe ser analizada manualmente.
dns_get_record() retorna un array de arrays
asociativos, o false
en caso de error.
Cada array contiene como mínimo los índices siguientes:
Atributo | Significado |
---|---|
host | El registro del espacio de nombres DNS que es descrito por los otros datos. |
class |
dns_get_record() solo retorna la clase de registro
Internet y, como tal, este índice siempre valdrá IN .
|
type | String que contiene el tipo de registro. Los atributos adicionales también estarán disponibles en el array según el valor de este tipo. Consulte la tabla a continuación. |
ttl |
"Time To Live" : duración antes de la expiración del registro.
Este valor es diferente de la duración original antes de la expiración,
sino que es este valor menos la duración desde la última consulta
al servidor DNS responsable.
|
Tipo | Valor adicional |
---|---|
A |
ip : una dirección IPv4, en formato numérico.
|
MX |
pri : prioridad del servidor de correo.
Los números bajos indican una prioridad alta.
target : FQDN del servidor de correo.
Ver también dns_get_mx().
|
CNAME |
target : FQDN del nombre del espacio DNS que sirve
como alias para este registro.
|
NS |
target : FQDN del nombre del servidor que es responsable
de este nombre de dominio.
|
PTR |
target : nombre de dominio al que apunta este registro.
|
TXT |
txt : string asociado arbitrariamente
a este registro.
|
HINFO |
cpu : número IANA que designa el procesador de la máquina
referenciada por este registro.
os : número IANA que designa el sistema operativo
de la máquina referenciada por este registro.
Ver » Operating System Names
para conocer el significado de estos valores.
|
CAA |
flags : Un campo de bits de un octeto: actualmente solo el bit 0 está definido,
significando 'critical' (crítico); los otros bits están reservados y deben ser ignorados.
tag : El nombre del tag CAA (string alfanumérico ASCII).
value : El valor del tag CAA (string binario, puede utilizar subformatos).
Para más información ver: » RFC 6844
|
SOA |
mname : FQDN de la fuente de este registro.
rname : dirección de correo electrónico del contacto administrativo de
este dominio.
serial : número de serie del nombre de dominio.
refresh : intervalo de actualización (en segundos)
que los servidores de nombres secundarios deben utilizar para almacenar en caché este nombre de dominio.
retry : duración (en segundos) de espera después de una actualización
fallida, antes de hacer un segundo intento.
expire : duración máxima (en segundos) de conservación
de una copia de los datos de zona sin poder hacer una actualización.
minimum-ttl : duración mínima (en segundos) durante la cual un
cliente conserva datos de zona antes de que envíe una nueva
consulta. Esta configuración puede ser anulada por otros registros.
|
AAAA |
ipv6 : dirección IPv6
|
A6 |
masklen : longitud (en octetos) a heredar desde
el objetivo especificado por chain .
ipv6 : dirección para que este registro específico se fusione
con chain .
chain : el registro padre a fusionar con los datos
ipv6 .
|
SRV |
pri : (prioridad) las prioridades más bajas deben
ser utilizadas primero.
weight : clasificación para elegir aleatoriamente entre los
servidores targets .
target y port : nombre de host y
puerto donde el servicio está disponible.
Para más información, ver: » RFC 2782
|
NAPTR |
order y pref : equivalente a
pri y weight arriba.
flags , services , regex ,
y replacement : parámetros como se definen
en la » RFC 2915.
|
Versión | Descripción |
---|---|
7.0.16, 7.1.2 | Se agregó soporte para registros de tipo CAA. |
Ejemplo #1 Ejemplo con dns_get_record()
<?php
$result = dns_get_record("php.net");
print_r($result);
?>
El resultado del ejemplo sería algo similar a:
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 ) )
Ejemplo #2 Ejemplo con dns_get_record() y DNS_ANY
Como es muy común buscar la IP de un servidor,
una vez que el campo MX ha sido resuelto, dns_get_record()
retornará también un array en el parámetro additional_records
que contendrá los registros asociados. authoritative_name_servers
también es retornado conteniendo una lista de los servidores de autoridad.
<?php
/* Solicita todos ("ANY") los registros para php.net,
luego crea los arrays $authns y $addtl
conteniendo una lista de nombres de servidores, y todos
los registros que van con ellos
*/
$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);
?>
El resultado del ejemplo sería algo similar a:
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...
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);
?>
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);
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