Bloquear direcciones IP.

Resumen.

El tráfico Web casi siempre es bienvenido, todos queremos que nuestros sitios Web tengan el mayor número de visitas posible, y este se convierte en un motivo de satisfacción y orgullo. Pero no siempre las cosas son así, a veces recibimos desde nuestros formularios de contacto decenas de mensajes spam, ataques de inyección SQL… Enfrentarse a situaciones así es fácil, solo tenemos que bloquear la dirección IP.

Artículo.

Todo usuario de Internet cuando navega lo hace bajo una dirección IP, unas veces esta es fija, otras veces cambia la IP en función de la ubicación del dispositivo móvil o bien lo hace a través de una VPN (red privada virtual). Pero siempre existirá un conjunto de 4 valores entre el 0 y 255 separados por puntos, por ejemplo 92.176.18.64 es una IP ubicada en Galicia, España. Y es que desde una dirección IP podemos tener información sobre nuestros usuarios, ya que las direcciones IP están geolocalizadas, aunque claro está, el usuario puede conectarse a través de un Proxy o bien una VPN, y no sabremos su ubicación real.

La forma de capturar una direccion IP es la siguiente:

$ip = $_SERVER['REMOTE_ADDR'];

Aún así, si vemos que en los mensajes a través de nuestro formulario de contacto todos los días recibimos varios mensajes de un remitente desconocido y con una información no solicitada, podemos ir pensando en bloquear esa dirección IP para que no recibir mas mensajes.

Supongamos que todos los días recibimos mensajes comerciales en un idioma que no es el nuestro provenientes de la dirección IP 45.155.204.6. Si geolocalizamos esta IP veremos que está en Rusia, y sabemos que este es uno de los principales focos tanto de spam como de ciberataques, es momento de proceder a bloquearla.

Creo conveniente advertir, que bloquear direcciones IP al primer correo no deseado, no es algo conveniente, ya que estamos limitando el tráfico a nuestro sitio Web, solo debemos bloquear cuando llega a ser molesto y no tenemos interés en esa ubicación. Debemos ser especialmente cautelosos cuando bloqueamos una dirección IP de nuestro país, y se llegamos ha hacerlo, puede ser conveniente desbloquearla un tiempo después, ya que es posible que la conducta malintencionada ya no se produzca.

Dicho esto, vamos con nuestra función, es esta:

<?php
// Bloquea las direcciones IP que coinciden con los
// tres primeros grupos numericos

function BloqueoIP($ip_bloqueadas,$ip_visitante){
$raiz_ip = explode('.', $ip_visitante);
$raizIP = "$raiz_ip[0]."."$raiz_ip[1]."."$raiz_ip[2].";
// strripos - NO diferencia mayusculas de minusculas
// strrpos - diferencia mayusculas de minusculas
$n_posicion = strripos($ip_bloqueadas, $raizIP); // La primera posicion es cero 0

if ($n_posicion === FALSE) {
// No esta bloqueada
$respuesta = 0;
} else {
// SI esta bloqueada
$respuesta = 1;
}
return $respuesta;
}
// Aplicamos la funcion
$ip_bloqueadas = '45.155.204.6|216.244.66.246|157.90.209.81|51.89.201.226|81.41.141.19';
$ip_entrada = '45.155.204.6'; // Si encuentra 45.155.204. la IP esta bloqueada

$ip_aceptada = BloqueoIP($ip_bloqueadas,$ip_entrada);

if($ip_aceptada == 0){
echo "La IP $ip_entrada esta permitida";
}else{
echo "La IP $ip_entrada esta bloqueada";
}

?>


Esta función la podemos colocar con “include” antes del código html. En primer lugar separamos cada grupo numérico formando un array usando como criterio el punto. De esa manera, uniendo cada uno de los elementos del array tenemos lo que podría considerarse la raíz de la dirección IP, la variación en el ultimo conjunto nos daría mas precisión sobre la ubicación geográfica.

De esta forma, si queremos bloquear la dirección IP 45.155.204.6 buscamos 45.155.204., ya que nos da lo mismo que la ubicación real sea, por ejemplo Moscú, o este 500 km mas al norte o en la dirección que sea. Si tratamos de bloquear direcciones completas nos podemos encontrar con que tendremos que bloquear 256 IP, (0 al 255), ya que, por experiencia sabemos que unas veces te llegan los mensajes desde la IP 45.155.204.7/13/136/214, con diferentes terminaciones.

Seguidamente, mediante strripos($ip_bloqueadas, $raizIP) buscamos esa raíz IP dentro del conjunto de IP bloqueadas. Esta función nos da una posición dentro de la cadena donde se realiza la búsqueda ($ip_bloqueadas), y devuelve FALSE si no se encuentra, en tal caso, la respuesta de la función será 0, y 1 en caso contrario.

Con este valor de respuesta de la función, ya solo tenemos que crear un condicional que nos realice alguna acción.

if($ip_aceptada == 0){
// IP permitida

}else{
// IP bloqueada
header("Location: error404.php");
exit();
}


En caso que la dirección IP este bloqueada, enviamos a usuario a nuestra página error404.php y detenemos la ejecución de la página. También podíamos enviarlo a una página externa, eso ya entra en el criterio del programador.

Otra posible opción podría ser por ejemplo declarar nula la variable mail de nuestro formulario antes de validarla con PHP, de esta forma nunca se superaría la validación y no se enviaría el mensaje.

$nombre = $_POST['nombre'];
$mail = $_POST['mail'];
$asunto = $_POST['asunto'];
$mensaje = $_POST['mensaje'];

if($ip_aceptada == 0){
// IP permitida

}else{
// IP bloqueada
$mail = null;
}
// Aquí iria la validación en PHP que impide que la variable $mail sea nula.

Y así ya estamos libres de visitas y mensajes molestos.
Tags: función || REMOTE_ADDR || bloqueo || IP || BloqueoIP || seguridad

Comentarios.

Sin comentarios, publica el tuyo.