INET ATON 함수

ip 주소를 정수로 반환하는 함수입니다.

 SELECT INET_ATON(expr);

예제(ex #1
 mysql> SELECT INET_ATON('209.208.207.206');
      ->3520122830

INET NTOA 함수

이 함수는 inet_aton 함수와 반대 기능으로 정수를 ip 주소로 변환합니다.

 SELECT INET_NTOA(expr);

예제(ex #2
 mysql> SELECT INET_NTOA(3520122830);
      -> 209.208.207.206

관련글: 2011/09/02 - 불량 ip차단하는 소스
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag IP

댓글을 달아 주세요

 <?php 
 
function getRealIpAddr(){    
    if(!empty(
$_SERVER['HTTP_CLIENT_IP']) && getenv('HTTP_CLIENT_IP')){    
        return 
$_SERVER['HTTP_CLIENT_IP'];    
    }   
    elseif(!empty(
$_SERVER['HTTP_X_FORWARDED_FOR']) && getenv('HTTP_X_FORWARDED_FOR')){    
        return 
$_SERVER['HTTP_X_FORWARDED_FOR'];    
    }   
    elseif(!empty(
$_SERVER['REMOTE_HOST']) && getenv('REMOTE_HOST')){    
        return 
$_SERVER['REMOTE_HOST'];    
    }   
    elseif(!empty(
$_SERVER['REMOTE_ADDR']) && getenv('REMOTE_ADDR')){    
        return 
$_SERVER['REMOTE_ADDR'];    
    }    
    return 
false;    
 }

 // ipv6 체크 함수
 function is_ipv6() {
    
$ip getRealIpAddr();
    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;
 }

 if(
is_ipv6() === true){
    echo 
"ipv6 입니다.";
 } else {
    echo 
"ipv4 입니다.";
 } 
 ?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

preg_match 함수를 이용해서 모바일로 접속했는지 여부를 확인할 수 있습니다.

예제 (ex #1
 <?php
 // HTTP_USER_AGENT 로 체크해보면 다음과 같은 결과를 보여줍니다.
 // 결과: Mozilla/5.0 (Linux; U; Android 2.2; ko-k... 

 
// 모바일 목록
 $mobilechk '/(iPod|iPhone|Android|BlackBerry|SymbianOS|SCH-M\d+|Opera Mini|Windows CE|Nokia|SonyEricsson|webOS|PalmOS)/i'


 
// 모바일 접속인지 PC로 접속했는지 체크합니다.
 
if(preg_match($mobilechk$_SERVER['HTTP_USER_AGENT'
])) {
    echo 
'모바일 접속입니다.'
;
 } else { 
    echo 
'PC 접속입니다.'

 } 
 ?>

다음 3G로 접속하여 ip 를 확인해 보겠습니다. 참고로 저는 LG U+ 3G로 접속합니다.

예제 (ex #2

 <?php
 
function getRealIpAddr
(){   
    if(!empty(
$_SERVER['HTTP_CLIENT_IP']) &&
     
getenv('HTTP_CLIENT_IP'
)){   
        return 
$_SERVER['HTTP_CLIENT_IP'
];   
    }  
    elseif(!empty(
$_SERVER['HTTP_X_FORWARDED_FOR']) &&
     
getenv('HTTP_X_FORWARDED_FOR'
)){   
        return 
$_SERVER['HTTP_X_FORWARDED_FOR'
];   
    }  
    elseif(!empty(
$_SERVER['REMOTE_HOST']) &&
     
getenv('REMOTE_HOST'
)){   
        return 
$_SERVER['REMOTE_HOST'
];   
    }  
    elseif(!empty(
$_SERVER['REMOTE_ADDR']) &&
     
getenv('REMOTE_ADDR'
)){   
        return 
$_SERVER['REMOTE_ADDR'
];   
    }   
    return 
false
;   
 }  
 echo 
getRealIpAddr
(); // 결과: 61.43.181.52 
 ?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

다음 소스로 국내 ip만 허용하거나, 아니면, 중국 ip를 차단시키거나 할 수 있습니다. 물론 완벽 차단은 어려울 수 있지만 어느 정도 효과는 있습니다. 이 소스는 geoip소스를 기초로 작성되었습니다.

먼저, 디비를 만들도록 합니다. 적절히 수정해서 디비를 만들도록 합니다. 여기서 필수 필드는 einterip 필드입니다.

 <?php
 $conn 
mysql_connect('localhost''디비 유저''디비 패스워드'
);
 if (!
$conn
) {
    die(
'연결 실패: ' mysql_error
());
 }
 echo 
'mysql 연결 성공!<br />'
;

 // 서버 접속이 종료되었는지 확인합니다.
 if (!mysql_ping($conn
)) {
    echo 
'서버 접속이 종료되었습니다.'
;
    exit;
 } 

 // 디비를 선택합니다.
 $selected mysql_select_db('디비 이름'$conn
);
 if (!
$selected
) {
    die (
'디비 연결실패 : ' mysql_error
());
 }

 $createtb 
"CREATE TABLE geoipcountry (
            sip char(15) NOT NULL, // 시작 ip
            eip char(15) NOT NULL, // 종료 ip
            sinterip int(10) unsigned NOT NULL, // 시작 ip 정수
            einterip int(10) unsigned NOT NULL, // 종료 ip 정수
            scountry char(3) NOT NULL, // 언어 최대 3자리 ex. US, KO
            bcountry char(50) NOT NULL, // 언어 최대 50자리 ex. KOREA, CHINA
            PRIMARY KEY  (einterip)
            KEY idx (sinterip,einterip)
        )
 "
;

 mysql_query($createtb
);


 // 서버 연결 종료
 if (is_resource($conn
)) {
     
mysql_close($conn
);
 }
 ?>

다음 코드로 GeoIPCountryWhois.csv 파일을 디비에 insert 해 줍니다.
(관련글: 2011/08/20 - [다운로드] - 전세계 ip 대역, 국내 ip 대역)

 <?php 
 $conn 
mysql_connect('localhost''디비 유저''디비 패스워드'
); 
 if (!
$conn
) { 
    die(
'연결 실패: ' mysql_error
()); 
 } 
 echo 
'mysql 연결 성공!<br />'


 
// 서버 접속이 종료되었는지 확인합니다. 
 
if (!mysql_ping($conn
)) { 
    echo 
'서버 접속이 종료되었습니다.'

    exit; 
 }  

 
// 디비를 선택합니다. 
 
$selected mysql_select_db('디비 이름'$conn
); 
 if (!
$selected
) { 
    die (
'디비 연결실패 : ' mysql_error
()); 
 } 

 $row 1
 
$handle fopen("GeoIPCountryWhois.csv""r"
); 
 while ((
$data fgetcsv($handle1000",")) !== false
) { 
    
$num count($data
); 
    echo 
"$row<br />\n"

    
$row
++; 

    
$sql false

    
$sql "INSERT INTO geoipcountry VALUES ("


    for (
$c=0$c $num$c
++) { 
        
$sql .= "'" $data[$c] . "'"

        if(
$c+!== $num
){ 
            
$sql .= ", "

        }
        
set_time_limit(0
);
    } 
    
$sql .= ");"
;  
 
 fclose($handle
);

 // 서버 연결 종료
 if (is_resource($conn
)) {
     
mysql_close($conn
);
 }
 ?> 

입력이 완료되었으면, 다음 코드로 원하지 않는 국가 ip를 차단해 줍니다.

 <?php 
 $conn 
mysql_connect('localhost''디비 유저''디비 패스워드'
); 
 if (!
$conn
) { 
    die(
'연결 실패: ' mysql_error
()); 
 } 
 echo 
'mysql 연결 성공!<br />'


 
// 서버 접속이 종료되었는지 확인합니다. 
 
if (!mysql_ping($conn
)) { 
    echo 
'서버 접속이 종료되었습니다.'

    exit; 
 }  

 
// 디비를 선택합니다. 
 
$selected mysql_select_db('디비 이름'$conn
); 
 if (!
$selected
) { 
    die (
'디비 연결실패 : ' mysql_error
()); 
 }  

 function getRealIpAddr(){  
    if(!empty(
$_SERVER['HTTP_CLIENT_IP']) && getenv('HTTP_CLIENT_IP'
)){  
        return 
$_SERVER['HTTP_CLIENT_IP'
];  
    } 
    elseif(!empty(
$_SERVER['HTTP_X_FORWARDED_FOR']) && getenv('HTTP_X_FORWARDED_FOR'
)){  
        return 
$_SERVER['HTTP_X_FORWARDED_FOR'
];  
    } 
    elseif(!empty(
$_SERVER['REMOTE_HOST']) && getenv('REMOTE_HOST'
)){  
        return 
$_SERVER['REMOTE_HOST'
];  
    } 
    elseif(!empty(
$_SERVER['REMOTE_ADDR']) && getenv('REMOTE_ADDR'
)){  
        return 
$_SERVER['REMOTE_ADDR'
];  
    }  
    return 
false
;  
 } 


 $ip false
;
 $ip getRealIpAddr
();

 // inet_aton 함수는 ip를 정수로 변환하는 함수임.
 // ex. #1
 $sql  "SELECT scountry,bcountry FROM geoipcountry WHERE einterip
    >= inet_aton('
$ip')"
;

 // ex. #2
 $sql  "SELECT scountry,bcountry FROM geoipcountry WHERE sinterip 
    <= inet_aton('
$ip') AND  einterip >= inet_aton('$ip')"
;

 if(
$result mysql_query($sql
)){
    
$row mysql_fetch_array($result
);
 } 

 // 중국 ip 차단
 if($row['scountry'] === "CN"){
    exit(
"죄송합니다. " . $row['bcountry'] .
      " ip는 접근이 차단되었습니다."
);
 }

 // 서버 연결 종료
 if (is_resource($conn
)) {
     
mysql_close($conn
);
 }
 ?> 

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

array fgetcsv ( resource $handle [, int $length [, string $delimiter [, string $enclosure [, string $escape ]]]] ) (PHP 4, PHP 5)

CSV 필드에 대한 파일 포인터와 구문 라인을 가져 오며, CSV 파일중 빈 줄은 하나의 필드를 NULL로 구성된 배열로 반환되어 에러로 취급하지는 않습니다.

csv파일인 전세계 ip대역을 열어 보면 6개 필드로 이루어져 있음을 알 수 있습니다.


다음 예제로 csv파일로 구성된 전세계 ip을 읽어 오게 합니다.

예제(ex #1

 <?php
 $row 
1
;
 $handle fopen("GeoIPCountryWhois.csv""r"
);
 while ((
$data fgetcsv($handle1000",")) !== FALSE
) {
    
$num count($data
);
    echo 
"<p> $num fields in line $row: <br /></p>\n"
;
    
$row
++;
    for (
$c=0$c $num$c
++) {
        echo 
$data[$c] . "<br />\n"
;
    }
 }
 fclose($handle
);
 ?>

인터넷 브라우저로 확인해 보면 다음 그림처럼 <br>태그로 구분되어 출력되게 됩니다.


csv파일을 어떤 형태로 읽어 오는지를 확인하였으니, 디비에 입력하는 코드를 작성해 보겠습니다.

예제(ex #2
 <?php
 $row 
1
;
 $handle fopen("GeoIPCountryWhois.csv""r"
);
 while ((
$data fgetcsv($handle1000",")) !== false
) {
    
$num count($data
);
    echo 
"<p> $num fields in line $row: <br /></p>\n"
;
    
$row
++;

    
$sql false
;
    
$sql "INSERT INTO ".$table_name." VALUES ("
;

    for (
$c=0$c $num$c
++) {
        
$sql .= "'" $data[$c] . "'"
;
        if(
$c+!== $num
){
            
$sql .= ", "
;
        }
    }
    
$sql .= ");"
;

    echo 
"$sql<br />"
;
 }
 fclose($handle
);
 ?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag IP

댓글을 달아 주세요

프록시의 익명성을 이용하면 인터넷에서 악의적인 리플이나 불법적인 행동을 하는 이를 원천 봉쇄가 어려울 수 있습니다. 사용자PC에서 프록시 서버를 경유해 특정 웹사이트로 접근하면 프록시 서버에 의해 사용자의 리얼ip를 숨길 수 있기 때문입니다.

그런데, 웹사이트에 접근할 때, 여러 가지 헤더정보를 넘겨 주게 되는데, 거기에 원 사용자 ip도 같이 넘겨 받게 됩니다. 그 메소드가 "X-Forwarded-For"이고, php에서는 "HTTP_X_FORWARDED_FOR" 변수에 담겨 지게 됩니다.

그러므로 HTTP_X_FORWARDED_FOR 변수로 비교 체크하여 불량 ip를 어느 정도 봉쇄할 수도 있지 않을까 싶습니다.

 <?php 
 
function getRealIpAddr(){ 
    if(!empty(
$_SERVER['HTTP_CLIENT_IP']) && getenv('HTTP_CLIENT_IP')){ 
        return 
$_SERVER['HTTP_CLIENT_IP']; 
    }
    elseif(!empty(
$_SERVER['HTTP_X_FORWARDED_FOR']) && getenv('HTTP_X_FORWARDED_FOR')){ 
        return 
$_SERVER['HTTP_X_FORWARDED_FOR']; 
    }
    elseif(!empty(
$_SERVER['REMOTE_HOST']) && getenv('REMOTE_HOST')){ 
        return 
$_SERVER['REMOTE_HOST']; 
    }
    elseif(!empty(
$_SERVER['REMOTE_ADDR']) && getenv('REMOTE_ADDR')){ 
        return 
$_SERVER['REMOTE_ADDR']; 
    } 
    return 
false
 }


 if(
$ip getRealIpAddr()){
     echo 
$ip;
 }
 
?>

참고: http://hackersnews.org/hn/read.cgi?board=hn_sangsik&nnew=2&y_number=83
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

2011년 전세계 ipv4 대역입니다.



2011년 전세계 ipv6 대역입니다.



출처: http://www.maxmind.com/app/geolitecountry

2011년 국내 ip 대역입니다.





출처: https://ip.kisa.or.kr
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag IP

댓글을 달아 주세요


 <?php
 
// $info[$i]["address"]: 서버 ip(또는 도메인)을 작성.
 // $info[$i]["port"]: 테스트할 포트를 작성.

 // 서버가 응답을 한다면 "Server Up" 메시지가 나오겠지만,
 // 응답이 없으면 "Server Down" 메시지가 나오게 됩니다.
 // 포트번호에 대한 구체적 정보는 아래 링크를 참조해 주세요.


 // 야후 80포트 Down 여부 확인.
 
$info[1]["address"]="yahoo.co.kr"

 
$info[1]["port"]="80"
;

 
// MS FTP 서버 Down 여부 확인.
 
$info[2]["address"]="ftp.microsoft.com"

 
$info[2]["port"]="21"


 
// 개인PC Down 여부, ip 주소로 테스트합니다. 
 // 본인의 ip주소로 테스트해 볼 수 있습니다.
 
$info[3]["address"]="207.46.133.140"

 
$info[3]["port"]="139"



 
// 확인할 ip 수
 
$infocount 3

 
// 지연시간, 기본 5초
 
$timeout 5


 for (
$i=1$i<=$infocount$i
++){ 
      
$fp = @fsockopen($info[$i]["address"], $info[$i]["port"], $errno$errstr$timeout
);
      if (
$fp
) { 
           echo 
"<br />Server Up: ".$info[$i]["address"]." [".$info[$i]["port"]. "]"
;
      } else {
           echo 
"<br /><font color='red'>Server Down: " $info[$i]["address"] . " [" $info[$i]["port"] . "]</font>"

      }
 }
 
?>

예제 (ex #1

 <?php 
 // 해당 ip Down 여부 확인.
 
$info["address"]="207.46.133.14"

 
$info["port"]="139"


 $fp = @fsockopen ($info["address"], $info["port"],
                    
$errno$errstr5
); 
 if (
$fp
) {  
      echo 
"해당 ip주소로 글 등록이 가능합니다."

 } else { 
      echo "실재 존재하는 ip주소가 아니므로 글등록 거부합니다. 스팸은 사양입니다."

 }
 
?>


게이트웨이나 일반 공유기 사용자일 경우 다음과 같이 임의대로 조회해서 테스트해줘도 되며, 만약 열려진 포트가 있다면 진행을 멈추게 됩니다.

예제(ex #2

제목

 <?php
 $port 
'7 9 13 17 19 20 21 23 25 42 47 50 51 53 80 88 102 110 119 
 135 139 143 389 443 445 464 515 548 554 554 563 593 636 993 1067 
 1068 1270 1433 1723 1755 1801 2101 2103 2105 2107 2393 2394 2701 
 2702 2703 2704 2725 2869 3268 3269 3389 5000 5722 6001 6002 6004 
 42424 51515'

 
$portarr split(" "$port
);

 // 테스트할 ip 
 
$ip = "125.185.168.129";



 foreach(
$portarr as $v
){
      if(
$fp = @fsockopen ($ip, $v$errno$errstr2
)){
           echo 
"Server Up : 125.185.168.129 [" $v "]<br />"
;
           break;
      } else {
           echo 
"<font color='red'>Server Down : 
                   125.185.168.129 ["
.$v."]</font><br />"
;
      }
 }
 /*
 결과:
 Server Down : 125.185.168.129 [7]
 Server Down : 125.185.168.129 [9]
 Server Down : 125.185.168.129 [13]
 Server Down : 125.185.168.129 [17]
 Server Down : 125.185.168.129 [19]
 Server Down : 125.185.168.129 [20]
 Server Up : 125.185.168.129 [21]
 */
 ?>


일반적인 핑 테스트 요청은 다음 링크에서 사용해 볼 수 있지만, 필요하다면 아래 링크에서 소스를 다운받아 사용할 수도 있습니다. 단, system함수 사용이 가능하여야 합니다.

  참고: http://www.theworldsend.net/

 핑테스트: http://www.theworldsend.net/php-ping.php

포트번호 참고: 2011/07/19 - 프로토콜 및 번호 포트


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요