주어진 인터넷 호스트 또는 IP 주소, IPv6 에 해당하는 DNS 레코드를 확인하는 소스입니다. 입력 값: ipv4, ipv6, 정수, 도메인, 이메일 주소로 레코드 값을 확인합니다.

<?php
 // 정수를 ip 주소로...
 // 4294967290는 255.255.255.250임

 // 결과: no
 if(checkdns_record(4294967290))
 {
    echo "yes";
 }
 else
 {
    echo "no";
 }


 // 결과: no
 if(checkdns_record("ffff::"))
 {
    echo "yes";
 }
 else
 {
    echo "no";
 }

 // 결과: no
 if(checkdns_record("180.10.0.1"))
 {
    echo "yes";
 }
 else
 {
    echo "no";
 }

 // 결과: yes
 if(checkdns_record("php.net"))
 {
    echo "yes";
 }
 else
 {
    echo "no";
 }

 // 결과: yes
 if(checkdns_record("habony@php.net"))
 {
    echo "yes";
 }
 else
 {
    echo "no";
 }

 // 결과: no
 if(checkdns_record("habony@php.po"))
 {
    echo "yes";
 }
 else
 {
    echo "no";
 }

 // 결과: no
 if(checkdns_record("land.naver.com"))
 {
    echo "yes";
 }
 else
 {
    echo "no";
 }

 /*
 *************************   email 체크   *************************
 */
 function email_chk($email)
 {
    if(@eregi("^[a-z\'0-9]+([._-][a-z\'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$",$email))
    {
        if(strlen($email) <= 320)
        {
            return true;
        }
        return false;
    }
    return false;
 }

 /*
 *************************   domain 체크   *************************
 */
 function domain_chk($haystack)
 {
    if(@eregi("([a-z0-9]+([._-][a-z0-9]+))+$",$haystack))
    { 
        $strlen = strlen(substr($haystack, 0, strpos($haystack, ".")));
        if(($strlen > 1) && ($strlen <= 63))
        {
            if(extension_doms(substr(strrchr($haystack, "."), 1)))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        return false;
    }
    return false;
 }

 /*
 *************************   ipv6, ipv4   *************************
 */
 function is_ipv6($ip) 
 {
    if(!preg_match("/^([0-9a-f\.\/:]+)$/",strtolower($ip))) 
    { 
        return false; 
    } 

    if(substr_count($ip,":") < 2) 
    { 
        return false; 
    } 

    $part = preg_split("/[:\/]/", $ip); 
    foreach($part as $i) 
    {
        if(strlen($i) > 4) 
        {
            return false;
        }
    }
    return true;
 }

 /*
 *************************   1차 도메인 체크   *************************
 */
 function extension_doms($key)
 {
    if(@eregi($key,
  "biz|co|com|cc|eu|jp|in|info|kr|me|mobi|name|net|org|
  pro|so|sx|tel|tv|xxx|ac|ae|ag|am|asia|at|be|bz|ch|cm|cn|
  cx|cz|de|es|eu|fm|fr|gd|gs|hk|hn|ht|im|in|io|jp|ki|la|lc|
  lt|lu|md|mg|mn|ms|mu|mx|nf|nu|nz|pe|ph|pk|pl|sb|sc|sg|sh|si|
  sk|tc|tk|tl|tm|tw|us|uk|vc|vg|ws"))
    {
        return true;
    }
    return false;
 }

 /*
 *************************   ipv6 dns   *************************
 */
 function checkdnsrr6($haystack)
 {
    if(function_exists("dns_get_record"))
    {
        $haystack = trim($haystack);
        $dnsrr = dns_get_record($haystack, DNS_AAAA);
        $records = array();
        foreach($dnsrr as $v)
        {
            if(!empty($v['ipv6']) && isset($v['ipv6']))
            {
                $records['chk'] = true;
                $records['dns'] = $v['ipv6'];
                if($v['type'] == "AAAA")
                {
                    $records['try'] = true;
                }
            }
        }
        return $records;
    }
    return false;
 }

 /*
 *************************   레코드 존재 여부 체크   ********************
 */
 function checkdns_record($haystack, $records="MX")
 {
    $haystack = trim($haystack);
    if(empty($haystack) && !isset($haystack))
    {
        return false;
    }

    if(strpos($haystack, "@"))
    {
        if(!email_chk($haystack))
        {
            return false;
        }
        $haystack = substr(strrchr($haystack,"@"), 1);
    }

    if(is_numeric($haystack))
    {
        $haystack = long2_ip($haystack);
    }

    if(domain_chk($haystack))
    {
        $mx = checkdnsrr6($haystack);
        if($mx['chk'] === true)
        {
            if(is_ipv6($mx['dns']))
            {
                return $mx['try'];
            }
            return false;
        }
    }

    if(is_ipv6($haystack))
    {
        return false;
    }

    if(function_exists('checkdnsrr'))
    {
        if(checkdnsrr($haystack, $records))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else if(substr(PHP_OS,0,1) === "W")
    {
        if(checkdnsrw($haystack, $records))
        {
            return true;
        }
        return false;
    }
    else
    {
        return false;
    }
 }

 function checkdnsrw($haystack, $records)
 {
    exec("nslookup -type=${records} ${haystack}", $resource);
    foreach($resource as $record)
    {
        if(@eregi("^${haystack}",$record))
        {
            return true;
        }
    }
    return false;
 }

 /*
 *************************   ip를 정수로...   *************************
 */
 function ip2_long($ip)
 {
    if(is_ipv6($ip) === false)
    {
        $ip = sprintf("%u",ip2long($ip));
        if(($ip < 0) || ($ip > 4294967295))
        {
            return false;
        }
        return $ip;
    }
    else
    {
        $resource = inet_pton6($ip);
        $i = 15;
        while($i >= 0)
        {
            $integerip = sprintf("%08b",(ord($resource[$i])));
            $resourceip = $integerip.$resourceip;
            $i--;
        }
        return gmp_strval(gmp_init($resourceip,2),10); 
    }
 }

 /*
 *************************   정수를 ip로...   *************************
 */
 function long2_ip($ip)
 {
    if($ip < 4294967295)
    {
        return long2ip($ip);
    }
    else
    {
        $resource = gmp_strval(gmp_init($ip,10),2);
        $resourcelen = strlen($resource);
        if($resourcelen < 128)
        {
            $pad = 128 - $resourcelen;
            for($i=1; $i<=$pad; $i++)
            {
                $resource = '0'.$resource;
            }
        }
        $i = 0;
        while($i <= 7)
        {
            $resourceip .= dechex(bindec(substr($resource,($i*16),16))).":";
            $i++;
        }
        return inet_ntop6(inet_pton6(substr($resourceip,0,-1)));
    }
 }

 /*
 *************************   inet_pton   *************************
 */
 function inet_pton6($ip)
 {
    if(function_exists('inet_pton'))
    {
        return inet_pton($ip);
    }
    else
    {
        $extract = explode(":", $ip);
        $resource = str_pad('', (4*(8-count($extract))), '0000', STR_PAD_LEFT);
        foreach ($extract as $val)
        {
            $resource .= str_pad($val, 4, '0', STR_PAD_LEFT);
        }
        return pack('H'.strlen($resource), $resource);
    }
 }

 /*
 *************************   inet_ntop   *************************
 */
 function inet_ntop6($ip) 
 {
    if(function_exists('inet_ntop'))
    {
        return inet_ntop($ip);
    }
    else
    {
        $extract = explode(':',
          substr(chunk_split(bin2hex($ip),4,':'),0,-1));
        foreach($extract as $val)
        {
            while($val{0} == '0')
            {
                $val = substr($val,1);
            }
            if($val != '')
            {
                if($resource != '')
                {
                    $resource .= ':';
                }
                $resource .= $val;
            }
            else
            {
                if(strpos($resource,'::') === false)
                {
                    if(substr($resource,-1) == ':')
                    {
                        continue;
                    }
                    $resource .= ':';
                    continue;
                }
                if($resource != '')
                {
                    $resource .= ':';
                }
                $resource .= '0';
            }
        }
    }
    return $resource;
 }
 ?>

0 댓글