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 — Busca registros de recursos DNS associados a um nome de host
$hostname
,$type
= DNS_ANY
,&$authoritative_name_servers
= null
,&$additional_records
= null
,$raw
= false
Busca registros de recursos DNS associados ao nome do host informado
no parâmetro hostname
.
hostname
hostname
deve ser um nome de host DNS válido, como
"www.example.com
". Pesquisas reversas podem ser geradas
usando a notação in-addr.arpa
, mas
gethostbyaddr() é mais adequada para
a maioria das pesquisas reversas.
Nota:
De acordo com os padrões DNS, os endereços de e-mail são fornecidos no formato
user.host
(por exemplo:hostmaster.example.com
em oposição ahostmaster@example.com
). Certifique-se de verificar este valor e modificá-lo se necessário antes de usá-lo com funções como mail().
type
Por padrão, dns_get_record() procurará quaisquer
registros de recursos associados ao hostname
.
Para limitar a consulta, use uma das
constantes
DNS_*
authoritative_name_servers
Passado por referência e, se fornecido, será preenchido com Registros de Recursos para os Servidores de Nomes Autoritativos.
additional_records
Passado por referência e, se fornecido, será preenchido com quaisquer Registros Adicionais.
raw
O parâmetro type
será interpretado como um ID de tipo DNS bruto
(as constantes DNS_*
não podem ser usadas).
O valor de retorno conterá uma chave data
, que precisa
ser analisada manualmente.
Esta função retorna um array de arrays associativos,
ou false
em caso de falha. Cada array associativo contém,
no mínimo, as seguintes chaves:
Atributo | Significado |
---|---|
host | O registro no namespace DNS ao qual o restante dos dados associados se refere. |
class |
dns_get_record() retorna apenas registros de classes da Internet e
como tal este parâmetro sempre retornará IN .
|
type | String contendo o tipo de registro. Atributos adicionais também estarão contidos no array resultante, dependendo do valor do tipo. Veja a tabela abaixo. |
ttl |
"Time To Live" (tempo de vida) restante para este registro. Isto não será
igual ao TTL original do registro, mas será igual ao TTL original menos qualquer
período de tempo decorrido desde que o servidor de nomes autoritativo foi consultado.
|
Tipo | Colunas Extras |
---|---|
A |
ip : Endereços IPv4 em notação decimal com pontos.
|
MX |
pri : Prioridade do trocador de mensagens.
Números mais baixos indicam maior prioridade.
target : FQDN do trocador de correio.
Consulte também dns_get_mx().
|
CNAME |
target : FQDN do local no namespace DNS ao qual
o registro tem alias.
|
NS |
target : FQDN do servidor de nomes que tem autoridade
para este nome de host.
|
PTR |
target : Local no namespace DNS para o qual
esse registro aponta.
|
TXT |
txt :Dados de string arbitrários associados a este registro.
|
HINFO |
cpu : Número IANA que designa a CPU da máquina
referenciada por este registro.
os : Número IANA que designa o sistema operacional
na máquina referenciada por este registro.
Consulte os » Operating System
Names da IANA (Nomes de Sistemas Operacionais)
para o significado desses valores.
|
CAA |
flags : Um campo de bits de um byte; atualmente apenas o bit 0 está definido,
significando 'crítico'; outros bits são reservados e devem ser ignorados.
tag : O nome da tag CAA (sequência alfanumérica ASCII).
value : O valor da tag CAA (string binária, pode usar subformatos).
Para obter informações adicionais, consulte: » RFC 6844
|
SOA |
mname : FQDN da máquina da qual os registros de
recursos foram originados.
rname : Endereço de e-mail do contato administrativo
deste domínio.
serial : Número de série desta revisão do domínio
solicitado.
refresh : Intervalo de atualização (segundos) que os servidores
de nomes secundários devem usar ao atualizar cópias remotas deste domínio.
retry : Tempo (segundos) de espera após uma
atualização com falha antes de fazer uma segunda tentativa.
expire : Período máximo de tempo (segundos) que um servidor DNS secundário
deve reter cópias remotas dos dados da zona sem uma
atualização bem-sucedida antes de descartar.
minimum-ttl : Período mínimo de tempo (segundos)
que um cliente pode continuar a usar uma resolução DNS antes de solicitar
uma nova resolução do servidor. Pode ser substituído por registros
de recursos individuais.
|
AAAA |
ipv6 : Endereço IPv6
|
A6 |
masklen : Comprimento (em bits) a ser herdado do destino
especificado por chain .
ipv6 : Endereço para este registro específico ser
mesclado com chain .
chain : Registro pai para mesclar com
dados ipv6 .
|
SRV |
pri : (Prioridade) as prioridades mais baixas devem ser usadas primeiro.
weight : Classificação para ponderar quais dos targets
comumente priorizados devem ser escolhidos aleatoriamente.
target e port : nome do host e porta onde o serviço
solicitado pode ser encontrado.
Para obter informações adicionais, consulte: » RFC 2782.
|
NAPTR |
order e pref : Equivalente a
pri e weight acima.
flags , services , regex
e replacement : Parâmetros como definidos pela
» RFC 2915.
|
Versão | Descrição |
---|---|
7.0.16, 7.1.2 | Adicionado suporte para tipo de registro CAA. |
Exemplo #1 Usando dns_get_record()
<?php
$result = dns_get_record("php.net");
print_r($result);
?>
O exemplo acima produzirá algo semelhante 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 ) )
Exemplo #2 Usando dns_get_record() e DNS_ANY
Como é muito comum pesquisar o endereço IP de um servidor de e-mail
depois que o registro MX tenha sido resolvido, dns_get_record()
também retorna um array em additional_records
que
contém registros associados. authoritative_name_servers
também é retornado contendo uma lista de servidores de nomes
autoritativos.
<?php
/* Solicita o registro "ANY" para php.net
e cria arrays $authns e $addtl
contendo uma lista de servidores de nomes e
quaisquer registros adicionais que os
acompanham */
$result = dns_get_record("php.net", DNS_ANY, $authns, $addtl);
echo "Resultado = ";
print_r($result);
echo "Servidor de Nomes Autoritativo = ";
print_r($authns);
echo "Adicional = ";
print_r($addtl);
?>
O exemplo acima produzirá algo semelhante a:
Resultado = 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 ) ) Servidor de Nomes Autoritativo = 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 ) ) Adicional = 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