Tengo la condición de filtrar la dirección IP del cliente y solo tengo su red IP así 1.1.0.0/17
. Si algún cliente de esta red será filtrado como usuario especial en mi sitio web. Y también uso php como lenguaje de servicio web.
En caso de que el cliente que lo tenga IP 1.1.4.24
se registre automáticamente en las bases de datos.
¿Alguien puede decirme alguna manera?
Respuesta1
¿Entonces supongo que estás buscando una solución php? En ese caso necesitarás algo como esto:
function get_ip_address() {
// check for shared internet/ISP IP
if (!empty($_SERVER['HTTP_CLIENT_IP']) && validate_ip($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
}
// check for IPs passing through proxies
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// check if multiple ips exist in var
if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) {
$iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
foreach ($iplist as $ip) {
if (validate_ip($ip))
return $ip;
}
} else {
if (validate_ip($_SERVER['HTTP_X_FORWARDED_FOR']))
return $_SERVER['HTTP_X_FORWARDED_FOR'];
}
}
if (!empty($_SERVER['HTTP_X_FORWARDED']) && validate_ip($_SERVER['HTTP_X_FORWARDED']))
return $_SERVER['HTTP_X_FORWARDED'];
if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validate_ip($_SERVER['HTTP_FORWARDED_FOR']))
return $_SERVER['HTTP_FORWARDED_FOR'];
if (!empty($_SERVER['HTTP_FORWARDED']) && validate_ip($_SERVER['HTTP_FORWARDED']))
return $_SERVER['HTTP_FORWARDED'];
// return unreliable ip since all else failed
return $_SERVER['REMOTE_ADDR'];
}
function validate_ip($ip) {
if (strtolower($ip) === 'unknown')
return false;
// generate ipv4 network address
$ip = ip2long($ip);
// if the ip is set and not equivalent to 255.255.255.255
if ($ip !== false && $ip !== -1) {
// make sure to get unsigned long representation of ip
// due to discrepancies between 32 and 64 bit OSes and
// signed numbers (ints default to signed in PHP)
$ip = sprintf('%u', $ip);
// do private network range checking
if ($ip >= 0 && $ip <= 50331647) return false;
if ($ip >= 167772160 && $ip <= 184549375) return false;
if ($ip >= 2130706432 && $ip <= 2147483647) return false;
if ($ip >= 2851995648 && $ip <= 2852061183) return false;
if ($ip >= 2886729728 && $ip <= 2887778303) return false;
if ($ip >= 3221225984 && $ip <= 3221226239) return false;
if ($ip >= 3232235520 && $ip <= 3232301055) return false;
if ($ip >= 4294967040) return false;
}
return true;
}
Ahora sólo necesitas llamar a $ip = get_ip_address();
Necesito decirte que ESTO ESEXTREMADAMENTE PELIGROSOpara dar a las personas acceso basado en IP!
Respuesta2
No estoy seguro de qué recursos tiene disponibles, pero hay dispositivos que logran esto en función de la identidad del usuario que inicia sesión. Por ejemplo, los firewalls Cisco ASA tienen una función de identidad que detecta eventos de inicio de sesión en un Microsoft servidor Active Directory y alerta al firewall de la dirección IP de ese usuario. Luego escribe las ACL según el nombre de usuario, a diferencia de la IP. No es perfecto pero funciona.
Firewall basado en identidad de Cisco:http://www.cisco.com/c/dam/en/us/products/collateral/security/asa-5500-series-next-generation-firewalls/at_a_glance_c45-675579.pdf
Como se ha dicho, el filtrado únicamente por dirección IP es sólo un primer paso de seguridad. Es fácil configurar una IP estática o incluso falsificar una IP. También necesitará algún mecanismo de autenticación.