¿Cómo puedo detectar si el usuario está en localhost en PHP?

5 minutos de lectura

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 no recuerdo mal, PHPMyAdmin hace algo como esto por razones de seguridad.

avatar de usuario
mauri

También puedes usar $_SERVER['REMOTE_ADDR'] para lo cual la dirección IP del cliente que solicita es proporcionada por el servidor web.

$whitelist = array(
    '127.0.0.1',
    '::1'
);

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}

  • Lo que haría que esto fuera más fácil de romper que falsificar la IP. Realmente deberías cambiarlo.

    – Peka

    13 de enero de 2010 a las 0:09

  • @ skcin7 podría ser la configuración de su servidor. revisalo.

    – mauris

    18 de enero de 2012 a las 11:53

  • @Pekka웃 solo puedes enviar, por ejemplo Host: 127.0.0.1 y se poblaría en HTTP_HOSTpor lo que no es un método confiable en absoluto.

    – Dejan Marjanović

    19 de marzo de 2013 a las 15:49

  • Sí, este es un mal consejo y en su forma actual necesita ser editado o rechazado.

    – Peka

    3 de agosto de 2013 a las 8:40


  • No olvides IPv6: $whitelist = array('127.0.0.1', '::1');

    – Crazy Max

    19 de febrero de 2014 a las 15:22

avatar de usuario
Jens Tornell

Como complemento, como función…

function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
    return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}

  • Como buena práctica recomendaría agregar “else return false;” para que la función siempre devuelva un valor booleano. O alternativamente, simplemente elimine el “if” por completo y en su lugar “return in_array ($_SERVER[‘REMOTE_ADDR’]$lista blanca);”

    –Joe Irby

    1 de febrero de 2018 a las 18:22

Los usuarios de sistemas operativos más nuevos (Win 7, 8) también pueden considerar necesario incluir una dirección remota en formato IPV6 en su matriz de lista blanca:

$whitelist = array('127.0.0.1', "::1");

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}

Lo siento pero todas estas respuestas me parecen terribles. Sugeriría reformular la pregunta porque, en cierto sentido, todas las máquinas son “localhost”.

La pregunta debería ser; ¿Cómo ejecuto diferentes rutas de código según la máquina en la que se ejecuta?

En mi opinión, la forma más fácil es crear un archivo llamado DEVMACHINE o lo que realmente quieras y luego simplemente verificar

file_exists(‘DEVMACHINE’)

¡Recuerde excluir este archivo cuando lo suba al entorno de alojamiento en vivo!

Esta solución no depende de la configuración de la red, no se puede falsificar y facilita el cambio entre ejecutar “código en vivo” y “código de desarrollo”.

avatar de usuario
Peka

$_SERVER["REMOTE_ADDR"] debería decirte la IP del usuario. Sin embargo, es falsificable.

Controlar esta pregunta de recompensa para una discusión muy detallada.

Creo que lo que recuerda con PHPMyAdmin es algo diferente: muchos servidores MySQL están configurados para que solo se pueda acceder a ellos desde localhost por razones de seguridad.

  • Vale la pena señalar que algunos servidores MySQL están configurados para no vincularse a una interfaz pública. De manera similar, si quisiera restringir una aplicación PHP de la misma manera, debería considerar servirla a través de una instancia de apache vinculada solo a una interfaz interna.

    – Frank Granjero

    12 de enero de 2010 a las 23:44

avatar de usuario
Bill el lagarto

No parece que debas usar $_SERVER['HTTP_HOST']porque este es el valor en el encabezado http, fácilmente falsificado.

Puedes utilizar $_SERVER["REMOTE_ADDR"] también, este es el valor más seguro, pero también es posible falsificar. Este remote_addr es la dirección a la que Apache devuelve el resultado.

  • Vale la pena señalar que algunos servidores MySQL están configurados para no vincularse a una interfaz pública. De manera similar, si quisiera restringir una aplicación PHP de la misma manera, debería considerar servirla a través de una instancia de apache vinculada solo a una interfaz interna.

    – Frank Granjero

    12 de enero de 2010 a las 23:44

avatar de usuario
Comunidad

Si quieres tener un lista blanca / lista permitida que apoya 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 manera podría establecer una lista de nombres/IP que podrá (seguro) ser detectado. Los nombres dinámicos agregan más flexibilidad para acceder desde diferentes puntos.

Tiene dos opciones comunes aquí, puede establecer un nombre en su archivo de hosts locales o podrías usar uno proveedor de nombres dinámicos que se podía encontrar en cualquier parte.

Esta función CACHES resulta porque gethostbyname es una función muy lenta.

Para este propósito 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 mayor confiabilidad, puede reemplazar el $_SERVIDOR[‘REMOTE_ADDR’] Para el obtener_dirección_ip() que @Pekka mencionó en su publicación como “esta pregunta de recompensa”

  • No sé por qué alguien le dio una puntuación negativa a mi respuesta, mientras que claramente ofrece una resolución dinámica de nombres y otros no. La resolución de DNS es lenta, por eso se requieren resoluciones de almacenamiento en caché.

    – Heroselohim

    21 de marzo de 2016 a las 19:27

¿Ha sido útil esta solución?