일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 네이버스마트 에디터
- php
- 톰캣
- html
- HTML5
- @RequestBody
- DB
- spring form tag
- 이클립스
- 웹 플랫폼 설치 관리자
- JSTL
- maven
- switch
- SSL
- java
- exception
- MYSQL
- 문자열
- 오라클
- checbox
- 날짜
- Oracle
- json
- 한글
- 스크립트
- 호환성
- null
- RADIO
- 전자정부 표준프레임워크
- jquery
- Today
- Total
개인적인 정리
국가별 접근 설정, 아이피, ip 본문
국가별 접근 제한 방법
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
다운로드 후 엑셀에서 파일을 열어 다른이름으로 저장을 선택한다.
옵션 ==> 텍스트(탭으로 분리)(*.txt)로 저장을 한다.
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 를 이용하여 작업하기
'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 |