특정 IP만 게시판에 접근이 가능하도록 하였습니다.

특정 IP만 게시판에 접근이 가능하도록 하였습니다.

QA

특정 IP만 게시판에 접근이 가능하도록 하였습니다.

본문


<?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

아래처럼 허용할 아이피를 . 기준으로 3번째 까지만 지정해두고, 

접속자의 아이피에서 3번째 까지만 검사하는 방법도 있습니다.

 


<?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;
 }
}
?>

답변 정말 감사드립니다.
이 코드에, 회원 아이디와 저 세 자리 아이피를 묶고 싶은데 그렇게 하려면 어떻게 해야하나요?

예를 들면,
A회원 (123.45.678)
B회원 (50.135.40).

이렇게 하고 싶은 이유가, 유동 아이피인 회원 분들이 대다수인데
네 자리 중 뒤에 두 자리가 바뀌는 경우가 많거든용 ㅠ


그러시면 DB를 활용 하셔서 하시는게 좋을것 같네요.
회원정보 테이블에 해당 회원에게 허용할 아이피를 입력할 필드를 만들고
해당 필드에 해당 아이디 회원에게 허용할 접속 아이피를 저장시킨뒤
위 소스의 $ok_ip_addr 배열에 db에서 가져온 로그인한 회원의 회원정보에 저장되있던 아이피를 받으시고,
이하 로직은 똑같이 하시면 될듯요.


 
// 접근 허용 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;
        }
    }
}
 

 

와 같은 형태로 변경가능합니다.

 

문자열의 일부분만 체크하는 형태라고 보시면됩니다.

우선 답변 감사드립니다.

테스트 삼아 제 아이피를 활용하여 "123.45.678." 식으로 해보았지만
"차단 됨" 이라고 뜹니다.

전체 아이피를 다 써봐도 "차단 됨" 문구가 뜹니다.
뭐가 문제인가요?

음.. 그러시면

if (strrpos($_SERVER[REMOTE_ADDR],$ok_ip_addr[$i]) === false)    {


이부분의 내용을 일부 변경해보죠

if (strpos($_SERVER[REMOTE_ADDR],$ok_ip_addr[$i]) === false)    {



strrpos => strpos 로

r 하나 빠진걸로 변경해보시죠


비교연산자 == 는 문자열자체를 비교하는것이구요
=== 는 비트값까지 비교하는 내용이라 오타는 아닙니다.

그리고, 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인지 의 문자는 눈으로 확인이 어려우니 앞뒤에 넣어주면
좀더 깔끔한 확인이 가능합니다.


 
<?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;
        }
    }
}

?>
 
답변을 작성하시기 전에 로그인 해주세요.
전체 123,714 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT