2009-09-23 13 views
5

Estoy usando el siguiente fragmento de código para redirigir una matriz de direcciones IP. Me preguntaba cómo iba a ir sobre la adición de una gama entera/bloque de direcciones IP a mi arsenal dissallowed ...¿Cómo redirigir todo un rango/bloque de direcciones IP con PHP?

<?php // Let's redirect certain IP addresses to a "Page Not Found" 
$disallowed = array("76.105.99.106"); 
$ip = $_SERVER['REMOTE_ADDR']; 

if(in_array($ip, $disallowed)) { 
header("Location: http://google.com"); 
exit; 
} 
?> 

He intentado utilizar "76.105.99. *", "76.105.99", "76.105 .99.0-76.105.99.255 "sin suerte.

Necesito usar PHP en lugar de mod_rewrite y .htaccess por otros motivos.

+0

Me gustaría pensar que había necesidad de rediseñar el código de comparación para entender la abreviatura que se va a utilizar. – Lazarus

Respuesta

4

Pruebe la función substr:

$ip = '76.105.99.'; 
if (substr($_SERVER['REMOTE_ADDR'], 0, strlen($ip)) === $ip) { 
    // deny access 
} 
+0

señor ¿y si el formato del rango de ip es 76.105.99.0/127? –

0

Sería mejor hacer esto en Apache (o cualquier otro servidor)

1

quién exactamente está interesado en el bloqueo? Puede usar PHP o Apache para bloquear (o permitir) un grupo de direcciones IP específicas.

Si está interesado en bloquear personas de un país completo, por ejemplo, existen herramientas que le brindan las direcciones IP que necesita bloquear. Desafortunadamente, no es tan simple como solo especificar un rango.

Consulte http://www.blockacountry.com/ que genera un conjunto de direcciones IP que puede pegar en su .htaccess para bloquear países enteros.

0

Creo que necesitará para crear un bucle for para añadir cada dirección IP (dentro del rango) a su matriz.

pseudo código

for i = 0 to 255 
    disallowed[i] = "76.105.99." + i 
next 
+0

Hacer un ciclo for parece ser una solución muy poco óptima. – rogeriopvl

11

Aquí está un ejemplo de cómo se puede comprobar una combinación particular de red/máscara:

$network=ip2long("76.105.99.0"); 
$mask=ip2long("255.255.255.0"); 
$remote=ip2long($_SERVER['REMOTE_ADDR']); 

if (($remote & $mask)==$network) 
{ 
    header("Location: http://example.com"); 
    exit; 
} 

Esto es mejor que usar un partido basado en cadena como se puede probar otras máscaras que se alinean dentro de un octeto, por ejemplo a/20 bloque de direcciones IP

+0

Esto no funciona para mí. ¿Alguna idea de por qué? – Ameer

+1

Hiciste algo mal, o hiciste una suposición que no era válida. –

+0

Mi código está aquí: ' ' Siempre dice que no hay coincidencia. Nota: Mi IP es 124.195.223.99 – Ameer

3

Puede abordar el problema de otra manera.

Si desea prohibir 76.105.99 * usted podría hacer:.

if (strpos($_SERVER['REMOTE_ADDR'], "76.105.99.")!==FALSE) 
{ 
    header ('Location: http://google.com'); 
} 
1

Lo que hay que hacer es tener una prueba para ver si una dirección particular, vive dentro de una gama determinada dirección definida por CIDR

Así, por ejemplo, tiene que ser capaz de decir

es 192.168.1.5

dentro

192.168.1.0/24

Esa función es fácil de escribir, suponiendo que tiene algunas herramientas básicas para realizar el trabajo CIDR.

Suponiendo que usted está en un sistema de 32 bits, esta clase http://snipplr.com/view/15557/cidr-class-for-ipv4/ atención atención a la función IPisWithinCIDR

0
$blocked_ip_range_array = array('109.237.108.0','109.238.0.0'); 
for($i=0;$i<count($blocked_ip_range_array);$i++){ 
    $network=ip2long($blocked_ip_range_array[$i]); 
    $blipr = explode(".",$blocked_ip_range_array[$i]); 
    if($blipr[2]=='0'){ 
     $mask=ip2long("255.255.0.0"); 
    } 
    else{ 
     $mask=ip2long("255.255.255.0"); 
    } 
    $remote=ip2long($_SERVER['REMOTE_ADDR']); 
    if (($remote & $mask)==$network) 
    { 
     header("Location: http://xurcun.info"); 
     exit; 
    } 
}  
+0

Sería mejor si también explicas el código. –

Cuestiones relacionadas