24'C 구름 많음
서울 강남구
주어진 인터넷 호스트 또는 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;
}
?>