채택완료
특정 IP만 게시판에 접근이 가능하도록 하였습니다.
Copy
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 접근 허용 IP 리스트
$ok_ip_addr=array(
"123.45.678.901",
"50.135.40.11"
);
// 해당 게시판 테이블에 접근 허용 IP가 아니라면 돌려보냄
if($bo_table =='spe') {
$key = in_array($_SERVER[REMOTE_ADDR],$ok_ip_addr);
if(!$key) {
echo "차단 됨";
include_once(G5_PATH.'/_tail.php');
exit;
}
}
?>
위 코드 처럼 리스트에 없는 아이피라면 접근이 불가능하도록 설정 하였습니다.
그런데 이렇게 하다보면 유동 아이피인 회원도 있어 문제가 있을 것 같아 질문 드립니다.
1. 유동아이피는 4자리 중 맨 마지막 뒷자리만 바뀌는 것으로 알고 있습니다. 맞나요?
2. 그렇다면 4번째 마지막 자리만 광대역(*)으로 설정하고 싶은데, 어떻게 하면 될까요?
접근 허용 IP를 123.45.678.* 이런 식으로 설정하고 싶습니다.
|
답변 3개 / 댓글 9개
채택된 답변
+20 포인트
아래처럼 허용할 아이피를 . 기준으로 3번째 까지만 지정해두고,
접속자의 아이피에서 3번째 까지만 검사하는 방법도 있습니다.
Copy
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 접근 허용 IP 리스트
$ok_ip_addr=array(
"123.45.678",
"50.135.40"
);
// 해당 게시판 테이블에 접근 허용 IP가 아니라면 돌려보냄
if($bo_table =='spe') {
$remote_addr_arr = explode(".",$_SERVER[REMOTE_ADDR]);
unset($remote_addr_arr[3]);
$remote_addr = implode(".",$remote_addr_arr);
$key = in_array($remote_addr,$ok_ip_addr);
if(!$key) {
echo "차단 됨";
include_once(G5_PATH.'/_tail.php');
exit;
}
}
?>
답변에 대한 댓글 3개
Copy
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 // 접근 허용 IP 리스트
$ok_ip_addr=array( "123.45.678.", "50.135.40.11" ); // 해당 게시판 테이블에 접근 허용 IP가 아니라면 돌려보냄
if($bo_table =='spe') {
foreach($ok_ip_addr as $k=>$v){
if( eregi($v,$_SERVER[REMOTE_ADDR]) ) { break; }
if( sizeof(ok_ip_addr) == $k+1 ) {
echo "차단 됨";
include_once(G5_PATH.'/_tail.php');
exit;
}
}
}
?>
Copy
// 접근 허용 IP 리스트
// 앞의 C class 영역만 배열로 초기화 값을 만듭니다.
$ok_ip_addr=array(
"123.45.678.",
"50.135.40."
);
// 해당 게시판 테이블에 접근 허용 IP가 아니라면 돌려보냄
if($bo_table =='spe') {
for ($i = 0; $i < count($ok_ip_addr); $i++) {
if (strrpos($_SERVER[REMOTE_ADDR],$ok_ip_addr[$i]) === false) {
echo "차단 됨";
include_once(G5_PATH.'/_tail.php');
exit;
}
}
}
와 같은 형태로 변경가능합니다.
문자열의 일부분만 체크하는 형태라고 보시면됩니다.
답변에 대한 댓글 6개
@추팔소
비교연산자 == 는 문자열자체를 비교하는것이구요
=== 는 비트값까지 비교하는 내용이라 오타는 아닙니다.
그리고, echo로 출력해보라고 말씀드린부분에서 0 이 나왔다는것은 불일치
즉 , false 에 해당되는 사항이라.
echo strpos($_SERVER[REMOTE_ADDR],$ok_ip_addr[$i]);
이렇게 확인하기보다는
echo "reqeust addr : [".$_SERVER[REMOTE_ADDR]."]<br>";
echo "valid addr : [".$ok_ip_addr[$i]."]<br>";
와 같이 확인하는게 더 깔끔하게 확인 가능하실거빈다.
팁으로 [ ]를 묶는건 공백인지, null인지 의 문자는 눈으로 확인이 어려우니 앞뒤에 넣어주면
좀더 깔끔한 확인이 가능합니다.
비교연산자 == 는 문자열자체를 비교하는것이구요
=== 는 비트값까지 비교하는 내용이라 오타는 아닙니다.
그리고, echo로 출력해보라고 말씀드린부분에서 0 이 나왔다는것은 불일치
즉 , false 에 해당되는 사항이라.
echo strpos($_SERVER[REMOTE_ADDR],$ok_ip_addr[$i]);
이렇게 확인하기보다는
echo "reqeust addr : [".$_SERVER[REMOTE_ADDR]."]<br>";
echo "valid addr : [".$ok_ip_addr[$i]."]<br>";
와 같이 확인하는게 더 깔끔하게 확인 가능하실거빈다.
팁으로 [ ]를 묶는건 공백인지, null인지 의 문자는 눈으로 확인이 어려우니 앞뒤에 넣어주면
좀더 깔끔한 확인이 가능합니다.
답변을 작성하려면 로그인이 필요합니다.
이 코드에, 회원 아이디와 저 세 자리 아이피를 묶고 싶은데 그렇게 하려면 어떻게 해야하나요?
예를 들면,
A회원 (123.45.678)
B회원 (50.135.40).
이렇게 하고 싶은 이유가, 유동 아이피인 회원 분들이 대다수인데
네 자리 중 뒤에 두 자리가 바뀌는 경우가 많거든용 ㅠ