2010-05-19 6 views
10

예를 들어, 모든 IP를 89.95 (89.95. .)부터 차단하고 싶습니다. 내 서버에 .htaccess 개의 파일이 없으므로 PHP로 처리해야합니다.PHP의 내 웹 사이트에서 특정 IP 블록을 차단하십시오.

if ($_SERVER['REMOTE_ADDR'] == "89.95.25.37") die(); 

특정 IP를 차단합니다. 전체 IP 블록을 어떻게 차단합니까?

대단히 감사합니다. 당신이 발견하는 경우

답변

12

=== 운영자는 89.95는 IP 주소의을 태초 에 있는지 확인합니다,

if(strpos($_SERVER['REMOTE_ADDR'], "89.95") === 0) 
{ 
    die(); 
} 

strpos()을보십시오. 즉, 원하는만큼 IP 주소를 구분할 수 있으며 그 다음에 오는 숫자가 무엇이든간에 차단됩니다.

는 예를 들어,이 모두 차단됩니다 :

89.95 ->89.95.12.34, 89.95.1234.1, 89.95.1.1
89.95.6 ->89.95.65.34, 89.95.61.1, 89.95.6987

(그 중 일부 그래도 유효한 IP 주소가 아님)

+0

도니는 다르게 작업 얻기 위해 이것을 사용,의 코드를 부흥 사용하여, 나는 놀랐어요'그 strpos'는'substr'보다 더 빨리 작동합니다. – zerkms

+0

@zerkms 정말 놀라지 않아야합니다. - 테스트가 실패 할 경우'strpos'가 즉시 리턴 할 수 있고, 그렇게하지 않아도됩니다 모든 문자열 복사 또는 할당. 또한'=='을'==='로 바꾸면 행동이 바뀌므로주의하지 않으면 안됩니다. 세 개의 등호를 사용하십시오. – gnud

+0

@gnud : 긴 문자열의 경우 strpos가 느려질 수 있습니다. 바늘을 검색하기 위해 전체 문자열을 반복해야하기 때문입니다. 그리고 나는'==='와'=='의 차이점을 알고 있습니다. – zerkms

1

부분 문자열 만들기 : 예를 들어 89.95.25. *를 차단하는 경우 IP의 하위 문자열을 만들고 마지막 두 숫자를 잘라내어 "89.95.25"와 비교합니다.

3

는 정수로 점선 쿼드로 변환 :

$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR'])); 

// only allow 10.0.0.0 – 10.255.255.255 
if (!($ip >= 167772160 && $ip <= 184549375)) { 
    die('Forbidden.'); 
} 
+0

정수를 사용하는 이유는 무엇입니까? 코드를 더 모호하게 만들었습니까? – zerkms

+0

이 대답은이 답변의 유용성을 떨어 뜨리지는 않지만 인증은 선택한 사람들 그룹이 승인 된 더 많은 선택 단어로 들립니다. 이 경우 소수의 사용자 만 승인하는 대신 권한이 없거나 소수의 사용자를 금지합니다. 따라서, 나는 더 나은 단어가 '금단의 것'이라고 생각할 것이다. –

+0

@ Chacha102 : 나는 편집했다. – webbiedave

4

사용 ip2long() 실제 IP 주소를 점으로 구분 된 십진수로 변환 할 수 있습니다. 그렇다면 쉽게 범위를 지정할 수 있습니다.

높고 낮은 범위에서 값을 얻으려면 ip2long()을 수행 한 다음이를 코드의 상수로 사용하십시오. 당신은 서브넷 마스크에 익숙하다면

, 당신은 이런 식으로 작업을 수행 할 수 있습니다

// Deny 10.12.*.* 
$network = ip2long("10.12.0.0"); 
$prefix = 16; 
$ip = ip2long($_SERVER['REMOTE_ADDR']); 
if ($network >> (32 - $prefix)) == ($ip >> (32 - $prefix)) { 
    die("Unauthorized"); 
} 

당신은에 다음을 설정할 수 있습니다 :

// Deny 10.12.*.* 
$network = ip2long("10.12.0.0"); 
$mask = ip2long("255.255.0.0"); 
$ip = ip2long($_SERVER['REMOTE_ADDR']); 
if (($network & $mask) == ($ip & $mask)) { 
    die("Unauthorized"); 
} 

을 또는 당신은이 형식 10.12.0.0/16에 대해 잘 알고 있다면 IP 주소를 추가하고 범위를 쉽게 사용자 정의 할 수있는 매우 관리하기 쉬운 코드가 있습니다. 적절한 서버 변수 이 검사를하고 알려진 IP 목록과 비교합니다 .. 그리고 예, PHP는 IP와 내 * 그래서 사용, 와일드 카드를 이해하지 :

+0

감사! 이것이 우리가하는 방식입니다. – Ami

+0

'$ _SERVER { 'REMOTE_HOST'}'만 조사하면 충분할까요? 어쩌면 사용자가 프록시를 사용하기 때문일 수도 있습니다. 따라서 'REMOTE_ADDR' 또는 [these] (http://stackoverflow.com/questions/15699101/get-the-client-ip-address-using-php#15699240)와 같이 확인해야하는 다른 매개 변수가 있습니다. 내가 맞습니까? 또는 내가 링크 한 것을하는 것이 유용하지 않은가? – stack

+0

네, 그냥 REMOTE_ADDR을 사용하십시오. –

1
$user_ip = $_SERVER['REMOTE_ADDR']; // get user ip 

$denyIPs = array("111.111.111", "222.222.222", "333.333.333"); 
if (in_array ($user_ip, $denyIPs)) { 
    // blocked ip 
} 
else { 
    // not blocked 
} 
+0

안녕하세요.이 형식을 222.222.222.0/15로 사용하려했지만 작동하지 않았습니다 ... –

1

이 항상 저를 위해 아주 잘 근무하고있다 IP 범위를 차단하는 데 도움이됩니다.

// The blacklisted ips. 
$denied_ips = array(
'1.2.3.4', 
'2.3.*', 
); 

// The function to get the visitor's IP. 
function getUserIP(){ 
    //check ip from share internet 
    if (!empty($_SERVER['HTTP_CLIENT_IP'])){ 
     $ip=$_SERVER['HTTP_CLIENT_IP']; 
    } 
    //to check ip is pass from proxy 
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ 
     $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; 
    } else { 
     $ip=$_SERVER['REMOTE_ADDR']; 
    } 
    return $ip; 
} 
//The user 
$visitorIp = getUserIP(); 

// Now let's search if this IP is blackliated 
$status = array_search($visitorIp, $denied_ips); 

// Let's check if $status has a true OR false value. 
if($status !== false){ 
    echo '<div class="error">Your IP has been banned! Stop spamming us!</div>'; 
    // header("Location: http://zombo.com"); 
    // exit; 
} 

는 부패하기 쉬운 보도에 좋은 기사 있습니다 : http://perishablepress.com/how-to-block-ip-addresses-with-php/

+0

"그렇습니다. PHP는 와일드 카드를 인식하므로 IP 범위 내에서 IP 범위를 차단하는 데 도움이됩니다." 확실한가요? 아마 PHP의 특정 버전? – artfulhacker

+0

헤더 리디렉션을 사용하는 배열 거부 기능이 작동합니다. :) – PipBoy2000

0

와일드 카드 검색

// Now let's search if this IP is blackliated 
$status = false; 
foreach($denied_ips as $val) 
{ 
    if (strpos($val,'*') !== false) 
    { 
     if(strpos($visitorIp, array_shift(explode("*", $val))) === 0) 
     { 
      $status = true; 
      break; 
     } 
    } 
    else 
    { 
     if(strcmp($visitorIp, $val) === 0) 
     { 
      $status = true; 
      break; 
     } 
    } 
} 
-2
$deny = array("111.111.111", "222.222.222", "333.333.333"); 

if (in_array($_SERVER['REMOTE_ADDR'], $deny)) { 
    header("location:http://www.google.com/"); 
    exit(); 
} 
관련 문제