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文件中执行就能出结果


以下给出一个查询的实例:

发表评论:

Powered by PHP 学习者(mail:517730729@qq.com)

原百度博客:http://hi.baidu.com/ssfnadn

备案号:闽ICP备17000564号-1

开源中国 PHPCHINA