개인적인 정리

국가별 접근 설정, 아이피, ip 본문

PHP

국가별 접근 설정, 아이피, ip

yeon.Biju 2017. 3. 21. 11:30

국가별 접근 제한 방법


1. 헤더를 이용하는 방법

아이피로 제어하는 것보다 정확성은 떨어지지만 이 역시 99%이상은 가능하다.

헤더가 비어들어오는 경우가 있는데.. 그 경우 반은 국내고 반은 국내가 아니다.

디비 연결에 비해서는 속도가 빠를 것이라고 생각이 됨.

<?

/* 2013.03.20

 * 국가별 아이 제한

 * 

 */

$langs = array();


if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {

    // break up string into pieces (languages and q factors)

    preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);


    if (count($lang_parse[1])) {

        // create a list like "en" => 0.8

        $langs = array_combine($lang_parse[1], $lang_parse[4]);


        // set default to 1 for any without q factor

        foreach ($langs as $lang => $val) {

            if ($val === '') $langs[$lang] = 1;

        }


        // sort list based on value

        arsort($langs, SORT_NUMERIC);

    }

}


// look through sorted list and use first one that matches our languages

$langStr = "";

foreach ($langs as $lang => $val) {

/*

if (strpos($lang, 'de') === 0) {

// show German site

} else if (strpos($lang, 'en') === 0) {

// show English site

}

*/


$langStr = $langStr.$lang;

//echo "langStr".$langStr;

//echo $lang;

}


$orlLangStr = $langStr;

$langStr = str_replace("en-US","",$langStr);

$langStr = str_replace("en","",$langStr);


//echo "langStr===".$langStr;

if(strpos($langStr, 'ko') === 0 ) {

echo "success";

exit;

}else {

echo "fail";

exit;


}

// show default site or prompt for language

?>


2. 디비로 접근 제어 하는 방법

http://jjaem.tistory.com/85


http://dev.maxmind.com/geoip/geolite  에서 아이피 목록을 다운받는다.

csv 파일을 다운을 받는다.


csv

GeoIPCountryWhois.rar




다운로드 후 엑셀에서 파일을 열어 다른이름으로 저장을 선택한다.

옵션 ==> 텍스트(탭으로 분리)(*.txt)로 저장을 한다.

GeoIPCountryWhois_txt.rar




csv를 한번에 이용하기에는 소스상에 일치되지 않는 지점들이 있어서 따로 가공을 하는 것이다.


178306 건의 데이타가 2013.04.08 테스트 결과 들어갔다.


테이블 생성

CREATE TABLE `country_ip` (

  `start_ip` varchar(15) DEFAULT NULL,

  `end_ip` varchar(15) DEFAULT NULL,

  `start_ipnum` bigint(15) DEFAULT NULL,

  `end_ipnum` bigint(15) DEFAULT NULL,

  `cc` char(2) DEFAULT NULL,

  `cn` varchar(50) DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


php 소스

<?

//db 연결


$db = @mysqli_connect('211.35.77.45', 'teabiju', 'teabiju12', 'gooutkorea');

if($db){

//echo "db Connect  Success";

}else {

//echo "db Connect Fail";

}


if (!$db) {

//DB 오류

//$err_message = "<p align=\"center\" style=\"font-weight: bold;\">사용자가 많아 이용할 수 없습니다. <br><br> 잠시후 다시 시도해 주시기 바랍니다</p>";

//include('../error.php');


$err_msg = "디비 연결 오류";

exit;

}


@mysqli_query($db, "set names utf8");



$testIp = "220.181.127.123";


$expIp = explode(".", $testIp);

$ipRange = $expIp[0]*256*256*256 + $expIp[1]*256*256 + $expIp[2]*256 + $expIp[4];


$cc = "";

echo "ipRange";

echo "<br />";


$sql = "SELECT CC FROM COUNTRY_IP WHERE START_IPNUM < $ipRange AND END_IPNUM > $ipRange ";

echo $sql;

$stmt = @mysqli_prepare($db, $sql);

@mysqli_stmt_bind_param($stmt);

@mysqli_stmt_execute($stmt);

echo mysqli_error($db);

@mysqli_stmt_bind_result($stmt, $cc );

@mysqli_stmt_store_result($stmt);

if (@mysqli_stmt_num_rows($stmt) > 0) {

@mysqli_stmt_fetch($stmt);

}

@mysqli_stmt_close($stmt);



echo "<br />";

echo "cccc===".$cc;


//cc 대한민국 ko


?>


3. apache GEO-IP 를 이용하여 작업하기

http://coffeenix.net/board_view.php?bd_code=1638

'PHP' 카테고리의 다른 글

maximum execution time of 30 seconds exceeded codeigniter  (0) 2022.06.10
php 현재 시간  (0) 2019.11.29
404 페이지 강제로 발생시키기  (0) 2017.07.17
file_get_contents 대체  (0) 2017.03.21
sql injection 정리  (0) 2017.03.21
파일 업로드시 확장자 체크  (0) 2017.03.21
xss filter  (0) 2017.03.21
[워드프레스] 워드프레스 최초 설치할 때  (0) 2017.03.21
Comments