주어진 인터넷 호스트 또는 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($haystack0strpos($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($haystackDNS_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($val4'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
;
}
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요