resueltos - ¿Cómo puedo detectar si el usuario está en localhost en PHP?
paginas php ejemplos (8)
¿Qué le $_SERVER[''SERVER_ADDR''] === $_SERVER[''REMOTE_ADDR'']
comparar $_SERVER[''SERVER_ADDR''] === $_SERVER[''REMOTE_ADDR'']
para determinar si el cliente está en la misma máquina que el servidor?
En otras palabras, ¿cómo puedo saber si la persona que usa mi aplicación web está en el servidor en el que reside? Si mal no recuerdo, PHPMyAdmin hace algo como esto por razones de seguridad.
Como complemento, como una función ...
function isLocalhost($whitelist = [''127.0.0.1'', ''::1'']) {
return in_array($_SERVER[''REMOTE_ADDR''], $whitelist);
}
Encontré una respuesta fácil.
Porque todos los discos locales tienen C: o D: o F: ... etc.
Solo detecta si el segundo personaje es:
if ( substr_compare(getcwd(),":",1,1) == 0)
{
echo ''<script type="text/javascript">alert(" The working dir is at the local computer ")</script>'';
$client_or_server = ''client'';
}
else
{
echo ''<script type="text/javascript">alert(" The working dir is at the server ")</script>'';
$client_or_server = ''server'';
}
Los usuarios de SO más recientes (Win 7, 8) también pueden considerar necesario incluir una dirección remota de formato IPV6 en su matriz blanca:
$whitelist = array(''127.0.0.1'', "::1");
if(!in_array($_SERVER[''REMOTE_ADDR''], $whitelist)){
// not valid
}
No parece que deba usar $_SERVER[''HTTP_HOST'']
, porque este es el valor en el encabezado http, fácilmente falsificado.
También puede usar $_SERVER["REMOTE_ADDR"]
, este es el valor más seguro, pero también es posible falsificar. Esta remote_addr
es la dirección a la que Apache devuelve el resultado.
Si desea tener una lista blanca / permisible que admita direcciones IP estáticas y nombres dinámicos .
Por ejemplo:
$whitelist = array("localhost", "127.0.0.1", "devel-pc.ds.com", "liveserver.com");
if (!isIPWhitelisted($whitelist)) die();
De esta forma, podría establecer una lista de nombres / direcciones IP que se podrán detectar (con seguridad). Los nombres dinámicos agregan más flexibilidad para acceder desde diferentes puntos.
Aquí tiene dos opciones comunes, puede establecer un nombre en su archivo de hosts local o simplemente puede usar un proveedor de nombre dinámico que se pueda encontrar en cualquier lugar.
Esta función CACHES resulta porque gethostbyname es una función muy lenta.
Para este pupose he implementado esta función:
function isIPWhitelisted($whitelist = false)
{
if ( isset($_SESSION) && isset($_SESSION[''isipallowed'']) )
{ return $_SESSION[''isipallowed'']; }
// This is the whitelist
$ipchecklist = array("localhost", "127.0.0.1", "::1");
if ($whitelist) $ipchecklist = $whitelist;
$iplist = false;
$isipallowed = false;
$filename = "resolved-ip-list.txt";
$filename = substr(md5($filename), 0, 8)."_".$filename; // Just a spoon of security or just remove this line
if (file_exists($filename))
{
// If cache file has less than 1 day old use it
if (time() - filemtime($filename) <= 60*60*24*1)
$iplist = explode(";", file_get_contents($filename)); // Read cached resolved ips
}
// If file was not loaded or found -> generate ip list
if (!$iplist)
{
$iplist = array(); $c=0;
foreach ( $ipchecklist as $k => $iptoresolve )
{
// gethostbyname: It''s a VERY SLOW function. We really need to cache the resolved ip list
$ip = gethostbyname($iptoresolve);
if ($ip != "") $iplist[$c] = $ip;
$c++;
}
file_put_contents($filename, implode(";", $iplist));
}
if (in_array($_SERVER[''REMOTE_ADDR''], $iplist)) // Check if the client ip is allowed
$isipallowed = true;
if (isset($_SESSION)) $_SESSION[''isipallowed''] = $isipallowed;
return $isipallowed;
}
Para una mejor confiabilidad, podrías reemplazar el $ _SERVER [''REMOTE_ADDR''] por la get_ip_address () que @Pekka mencionó en su post como "esta pregunta sobre recompensas"
$_SERVER["REMOTE_ADDR"]
debería indicarle la IP del usuario. Es spoofable, sin embargo.
Verifique esta pregunta de recompensas para una discusión muy detallada.
Creo que lo que recuerdas con PHPMyAdmin es algo diferente: muchos servidores MySQL están configurados de modo que solo se puede acceder desde el host local por razones de seguridad.
También puede usar $_SERVER[''REMOTE_ADDR'']
para el cual la dirección IP del cliente que solicita la proporciona el servidor web.
$whitelist = array(
''127.0.0.1'',
''::1''
);
if(!in_array($_SERVER[''REMOTE_ADDR''], $whitelist)){
// not valid
}