테스트 사이트 - 개발 중인 베타 버전입니다

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

추팔소 7년 전 조회 3,215

</p>

<p><?php

if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가</p>

<p>// 접근 허용 IP 리스트

$ok_ip_addr=array(

"123.45.678.901",

"50.135.40.11"

);</p>

<p>// 해당 게시판 테이블에 접근 허용 IP가 아니라면 돌려보냄

if($bo_table =='spe') {

 $key = in_array($_SERVER[REMOTE_ADDR],$ok_ip_addr);</p>

<p> if(!$key) {

  echo "차단 됨";

  include_once(G5_PATH.'/_tail.php');

  exit;

 }

}

?></p>

<p>

 

 

위 코드 처럼 리스트에 없는 아이피라면 접근이 불가능하도록 설정 하였습니다.

 

그런데 이렇게 하다보면 유동 아이피인 회원도 있어 문제가 있을 것 같아 질문 드립니다.

 

1. 유동아이피는 4자리 중 맨 마지막 뒷자리만 바뀌는 것으로 알고 있습니다. 맞나요?

2. 그렇다면 4번째 마지막 자리만 광대역(*)으로 설정하고 싶은데, 어떻게 하면 될까요?

 

접근 허용 IP를 123.45.678.* 이런 식으로 설정하고 싶습니다.

댓글을 작성하려면 로그인이 필요합니다.

답변 3개

채택된 답변
+20 포인트
식쏭
7년 전

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

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

 

</p>

<p><?php

if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가

// 접근 허용 IP 리스트

$ok_ip_addr=array(

"123.45.678",

"50.135.40"

);

// 해당 게시판 테이블에 접근 허용 IP가 아니라면 돌려보냄

if($bo_table =='spe') {</p>

<p> $remote_addr_arr = explode(".",$_SERVER[REMOTE_ADDR]);

 unset($remote_addr_arr[3]);

 $remote_addr = implode(".",$remote_addr_arr);</p>

<p> $key = in_array($remote_addr,$ok_ip_addr);

 if(!$key) {

  echo "차단 됨";

  include_once(G5_PATH.'/_tail.php');

  exit;

 }

}

?></p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

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

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

이렇게 하고 싶은 이유가, 유동 아이피인 회원 분들이 대다수인데
네 자리 중 뒤에 두 자리가 바뀌는 경우가 많거든용 ㅠ
상큼쏭
7년 전
@추팔소
그러시면 DB를 활용 하셔서 하시는게 좋을것 같네요.
회원정보 테이블에 해당 회원에게 허용할 아이피를 입력할 필드를 만들고
해당 필드에 해당 아이디 회원에게 허용할 접속 아이피를 저장시킨뒤
위 소스의 $ok_ip_addr 배열에 db에서 가져온 로그인한 회원의 회원정보에 저장되있던 아이피를 받으시고,
이하 로직은 똑같이 하시면 될듯요.
추팔소
7년 전
DB를 활용하는 건 저에게 너무나 어려워서 ㅠ_ㅠ
php 코드로 이용할 수 있는 방법은 없을까요?

댓글을 작성하려면 로그인이 필요합니다.

식쏭
7년 전

</p>

<p> </p>

<p><?php</p>

<p>if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 // 접근 허용 IP 리스트</p>

<p>$ok_ip_addr=array( "123.45.678.", "50.135.40.11" ); // 해당 게시판 테이블에 접근 허용 IP가 아니라면 돌려보냄</p>

<p>

if($bo_table =='spe') {  

    foreach($ok_ip_addr as $k=>$v){</p>

<p>        if( eregi($v,$_SERVER[REMOTE_ADDR]) ) { break; }</p>

<p>        if( sizeof(ok_ip_addr) == $k+1 ) {</p>

<p>            echo "차단 됨";

            include_once(G5_PATH.'/_tail.php');  

             exit;

        }

    }

}</p>

<p>

?></p>

<p> </p>

<p>

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

플래토
7년 전

</p>

<p> </p>

<p>// 접근 허용 IP 리스트</p>

<p>

// 앞의 C class 영역만 배열로 초기화 값을 만듭니다.

$ok_ip_addr=array(

"123.45.678.",      

"50.135.40."

);

// 해당 게시판 테이블에 접근 허용 IP가 아니라면 돌려보냄

if($bo_table =='spe') {</p>

<p>    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;

        }

    }

}</p>

<p> </p>

<p>

 

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

 

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 6개

추팔소
7년 전
우선 답변 감사드립니다.

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

전체 아이피를 다 써봐도 "차단 됨" 문구가 뜹니다.
뭐가 문제인가요?
플래토
7년 전
@추팔소 음.. 그러시면

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


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

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



strrpos => strpos 로

r 하나 빠진걸로 변경해보시죠
추팔소
7년 전
그것도 해봤었지만 안됐습니다 ㅠㅠ
플래토
7년 전
echo "차단됨"을 막고
왜안되는지 비교문의 내용을 찍어보세요
그러면 원인이 보일겁니다
추팔소
7년 전
= 가 하나 더 입력되어 있었네요, 일단 오타는 수정했는데,

echo 차단 됨을 주석 처리 하고

echo strpos($_SERVER[REMOTE_ADDR],$ok_ip_addr[$i]);

이렇게 띄워보면 숫자 0 만 뜹니다.
플래토
7년 전
@추팔소
비교연산자 == 는 문자열자체를 비교하는것이구요
=== 는 비트값까지 비교하는 내용이라 오타는 아닙니다.

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

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인