2010-05-19 12 views
10

Me gustaría, por ejemplo, bloquear cada IP desde la base 89.95 (89.95. .). No tengo .htaccess archivos en mi servidor, así que tendré que hacerlo con PHP.Bloque de IP específico de mi sitio web en PHP

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

Bloquear IP específico. ¿Cómo puedo bloquear bloques enteros de IP?

Muchas gracias.

Respuesta

12

Trate strpos()

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

Si te fijas, el operador === se asegura de que el 89.95 está en el begining de la dirección IP. Esto significa que puede separar la mayor cantidad posible de la dirección IP, y bloqueará sin importar qué números vengan después.

Por ejemplo, todos ellos serán bloqueados:

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

(algunos de los no son direcciones IP válidas)

+0

jeje, me sorprende que ' strpos' aquí funciona más rápido que 'substr' – zerkms

+0

@zerkms no debería ser realmente sorprendente -' strpos' puede regresar inmediatamente si la prueba falla, y no tiene que ver cualquier copia o asignación de cadenas. Además, solo quería señalar que el comportamiento cambia si cambia '===' por '==', así que no haga eso. Usa tres signos iguales – gnud

+0

@gnud: para strings largos strpos sería más lento, simplemente porque debería iterar sobre toda la cadena para buscar la aguja. y sé cuál es la diferencia de '===' y '=='. – zerkms

1

Hacer una subcadena :) Por ejemplo, para bloquear 89.95.25. * Crea una subcadena de IP, cortando los dos últimos números y compárelo con "89.95.25".

3

convertir el cuaterna a un entero:

$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

¿Cuál es la razón de usar números enteros aquí? ¿el código está más ofuscado? – zerkms

+0

No es que esto disminuya la utilidad de esta respuesta, pero la Autorización suena más como una palabra de aceptación, donde se autoriza a un grupo selecto de personas. En este caso, en lugar de autorizar solo a unas pocas personas, no autoriza o prohíbe a algunas personas. Como tal, creo que una palabra mejor sería 'Prohibida'. –

+0

@ Chacha102: he editado. – webbiedave

4

Uso ip2long() para convertir decimal con puntos a una dirección IP real. Entonces puedes hacer rangos fácilmente.

Simplemente haga ip2long() en el rango alto y bajo para obtener el valor, luego use esos como constantes en su código.

Si está familiarizado con el enmascaramiento de subred, puede hacerlo de esta manera:

// 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"); 
} 

O si usted está familiarizado con este formato 10.12.0.0/16:

// 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"); 
} 

Usted puede convertirlas en funciones y tiene un código muy manejable, por lo que es fácil agregar direcciones IP y personalizar los rangos.

+0

¡Gracias! Así es como lo estamos haciendo. – Ami

+0

Investigar solo '$ _SERVER {'REMOTE_HOST'}' sería suficiente? Porque tal vez el usuario use un proxy. Por lo tanto, hay otros parámetros que debe verificar, como 'REMOTE_ADDR' o [these] (http://stackoverflow.com/questions/15699101/get-the-client-ip-address-using-php#15699240). ¿Estoy en lo cierto? o hacer lo que he vinculado no es útil? – stack

+0

Sí, solo usa 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

hola Intenté usar este formato 222.222.222.0/15 pero no funcionó ... –

1

Esto siempre ha funcionado muy bien para mí: Este cheques por las variables de servidor adecuadas y lo compara con una lista de direcciones IP conocidas .. y sí, PHP entiende comodines, así que usar * dentro de la IP con ayudar a bloquear rangos de direcciones 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; 
} 

También hay un gran artículo en perecederos Prensa: http://perishablepress.com/how-to-block-ip-addresses-with-php/

+0

"y sí, PHP entiende los comodines, por lo que usar * dentro de la IP ayuda a bloquear rangos de direcciones IP." ¿estás seguro de eso? versión específica de php tal vez? – artfulhacker

+0

Denegar matriz con redirección de encabezado funciona bien :) – PipBoy2000

0

usando de revivir código, utilice esto para conseguir comodín de búsqueda de trabajo

// 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(); 
} 
Cuestiones relacionadas