Bloquear bloque de IP específico de mi sitio web en PHP

5 minutos de lectura

Bloquear bloque de IP especifico de mi sitio web en
iTayb

Me gustaría, por ejemplo, bloquear todas las IP desde la base 89.95 (89.95..). no tengo .htaccess archivos en mi servidor, así que tendré que hacerlo con PHP.

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

Bloquearía una IP específica. ¿Cómo puedo bloquear bloques completos de IP?

Bloquear bloque de IP especifico de mi sitio web en
tyler carter

Tratar strpos()

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

Si te fijas, el === El operador se asegura de que el 89.95 esta en el comenzando de la dirección IP. Esto significa que puede especificar toda la dirección IP que desee, y se bloqueará sin importar qué números vengan después.

Por ejemplo, todos estos 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

(aunque algunas de esas no son direcciones IP válidas)

  • jeje, me sorprende que strpos aquí funciona más rápido que substr

    – zerkms

    19 mayo, 2010 a las 22:42

  • @zerkms no debería sorprendernos – strpos puede regresar inmediatamente si la prueba falla, y no tiene que hacer ninguna copia o asignación de cadenas. Además, solo quería señalar que el comportamiento cambia si cambia === por ==, así que no hagas eso. Usa tres signos iguales.

    – gnud

    19 mayo, 2010 a las 23:09

  • @gnud: para cadenas largas, strpos sería más lento, solo porque debería iterar sobre toda la cadena para buscar la aguja. y sé cuál es la diferencia de === y ==.

    – zerkms

    19 mayo, 2010 a las 23:29

  • @zerkms Sí, el == contra === fue una nota separada para complementar la respuesta, no dirigida a usted :=)

    – gnud

    19 mayo, 2010 a las 23:35

Bloquear bloque de IP especifico de mi sitio web en
marcus adams

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

Solo haz ip2long() en el rango alto y bajo para obtener el valor, luego utilícelos como constantes en su código.

Si está familiarizado con el enmascaramiento de subred, puede hacerlo así:

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

Puede convertirlos en funciones y tener un código muy manejable, lo que facilita agregar direcciones IP y personalizar los rangos.

  • ¡Gracias! Así es como lo estamos haciendo.

    – Ami

    22 mayo 2012 en 12:46

  • investigando solo $_SERVER{'REMOTE_HOST'} ¿seria suficiente? Porque tal vez el usuario usa un proxy. Entonces, hay algunos otros parámetros que debe verificar, como REMOTE_ADDR o estos. ¿Tengo razón? o hacer lo que vinculé no es útil?

    – pila

    30 jun.


  • Sí, solo use REMOTE_ADDR.

    –Marcus Adams

    01 jul.

1641823127 881 Bloquear bloque de IP especifico de mi sitio web en
webbiedave

Convierta el cuádruple punteado en un número 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.');
}

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

    – zerkms

    19 mayo, 2010 a las 22:32

  • No es que esto disminuya la utilidad de esta respuesta, pero Autorización suena más como una palabra de Opt-In, donde se autoriza a un grupo selecto de personas. En este caso, en lugar de autorizar solo a unas pocas personas, desautoriza o prohíbe a algunas personas. Como tal, creo que una mejor palabra sería ‘Prohibido’.

    – Tyler Carter

    19 mayo, 2010 a las 22:34

  • @webbiedave: jajaja. de nuevo: ¿cuál es la razón de usar números enteros aquí?

    – zerkms

    19 mayo, 2010 a las 22:37

  • @zerkms, ¿de qué otra manera manejará un rango de clase A o B? Estarás escribiendo mucho código si mantienes la dirección IP en formato decimal con puntos.

    –Marcus Adams

    19 mayo, 2010 a las 22:40

  • @zerkms, la pregunta dice “¿Cómo puedo bloquear bloques completos de IP?”

    –Marcus Adams

    20 mayo 2010 en 12:13


Haz una subcadena 🙂 Por ejemplo, para bloquear 89.95.25.*, crea una subcadena de la IP, corta los dos últimos números y compárala con “89.95.25”.

1641823127 205 Bloquear bloque de IP especifico de mi sitio web en
Sumith Harshan

$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
}

1641823127 309 Bloquear bloque de IP especifico de mi sitio web en
reanimar

Esto siempre me ha funcionado muy bien: verifica las variables de servidor adecuadas y las compara con una lista de IP conocidas… y sí, PHP entiende los comodines, por lo que usar * dentro de la IP ayuda a bloquear rangos de 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 Perishable Press:
http://perishablepress.com/how-to-block-ip-addresses-with-php/

1641823127 607 Bloquear bloque de IP especifico de mi sitio web en
ingeniosohacker

usando el código de revive, use esto para que funcione la búsqueda con comodines

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

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad