PHP函数checkdnsrr用法详解(可用于验证域名邮箱真伪)
2020-10-15 10:03:32
本文通过实际应用例子讲述了PHP函数checkdnsrr用法。
checkdnsrr 检查指定网址的 DNS 记录是否存在。
语法: int checkdnsrr(string host, string [type]);
返回值: 整数
函数种类: 网络系统
PHP下的checkdnsrr函数 -- 可以根据所给定的host name(域名)或者IP地址检查它是否有DNS各项记录(包括A记录、MX记录、NS记录、CNAME、PTR记录、AAAA记录、SRV记录、TXT记录、SOA记录等等),本函数用来检查 DNS 的字段纪录。指定的参数 host 可以是网络位址 (IP Address),也可以用机器名称 (Domain Name)。参数 type 可以省略,内定值为 MX。而参数 type 的值可为以下的其中之一:A、MX、NS、SOA、PTR、CNAME 或 ANY。若找到了指定网址的 DNS 字段,返回 true;若未找到指定的 DNS 字段或是有错误均会返回 false。这里不是返回实际的DNS记录值而是返回一个是否存在的状态。如果需要返回实际值需要用到dns_get_record()
主要可以用来检测一个输入的域名的真实性,以及用于网站验证用户输入的邮箱是否真实存在(有没有MX记录),当然也可以开发成查询平台,供用户查询各个域名的各项DNS记录情况;
用法:
checkdnsrr ( string $host [, string $type = "MX" ] )
第一个参数是域名或者ip
第二个参数是解析类型,分别有:
A (Address) 记录 指定主机名(或域名)对应的IP地址记录。
MX 记录 指定邮件交换记录(默认)
NS 记录 指定域名服务器的记录,指定该域名由哪个DNS来进行解析。
SOA记录 一般在辅助的dns服务器里才用到,用来指定谁是主服务器。
PTR记录 从ip指向域名的反向解析记录
CNAME记录 别名记录
AAAA记录 是一个指向IPv6的记录
A6记录 同上
SRV记录 它是DNS服务器的数据库中支持的一种资源记录的类型,一般是为Microsoft的活动目录设置时的应用。
TXT记录 文本信息
ANY记录 任何记录,所有数据类型
应用案例一、php验证用户输入的邮箱有效性和正确性,用checkdnsrr验证email的域名部分的有效性(Linux下可用):
function validate_email($email){
$exp="^[a-z'0-9]+([._-][a-z'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";
if(eregi($exp,$email)){ //先用正则表达式验证email格式的有效性
if(checkdnsrr(array_pop(explode("@",$email)),"MX")){//再用checkdnsrr验证email的域名部分的有效性
return true;
}else{
return false;
}
}else{
return false;
}
}
目前PHP5.3版之前的自带checkdnsrr函数只在linux平台有效。window平台下不能使用,幸好有人研究了以下方法可以使用。
另外写了个函数代替checkdnsrr函数在window平台环境使用,用if判断,如果存在checkdnsrr函数就使用,如果不存在就使用nslookup。
if (!function_exists('checkdnsrr ')) {
function checkdnsrr($host, $type) {
if(!empty($host) && !empty($type)) {
@exec('nslookup -type=' . escapeshellarg($type) . ' ' . escapeshellarg($host), $output);
foreach ($output as $k => $line) {
if(eregi('^' . $host, $line)) {
return true;
}
}
}
return false;
}
}
应用上面的方法,写了一个案例
案例二
if(!function_exists('checkdnsrr')){
function checkdnsrr($host, $type=''){
if(!empty($host)){
$type = (empty($type)) ? 'MX' : $type;
exec('nslookup -type='.$type.' '.escapeshellcmd($host), $result);
$it = new ArrayIterator($result);
foreach(new RegexIterator($it, '~^'.$host.'~', RegexIterator::GET_MATCH) as $result){
if($result){
return true;
}
}
}
return false;
}
}
案例三:这是一个可以实际应用的案例,放到PHP文件中执行就能出结果
以下给出一个查询的实例:
发表评论: