Pregunta

En otras palabras, ¿cómo puedo saber si la persona que utiliza 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.

¿Fue útil?

Solución

También puede utilizar $_SERVER['REMOTE_ADDR'] para los que la dirección IP del cliente solicitante está dado por el servidor web.

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

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

Otros consejos

Como complemento, en función ...

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

Los usuarios de sistemas operativos más recientes (Win 7, 8) también pueden verse en la necesidad de incluir una dirección remota IPV6-formato en su arsenal lista blanca:

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

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

$_SERVER["REMOTE_ADDR"] debe decirle IP del usuario. Es falsificables, sin embargo.

Verificar esta pregunta recompensas para una discusión muy detallada.

Creo que lo que se acuerde con phpMyAdmin es algo diferente: Muchos servidores de MySQL están configurados de manera que sólo se puede acceder desde localhost por razones de seguridad.

No parece que puedes usar $_SERVER['HTTP_HOST'], porque este es el valor de la cabecera HTTP, fácilmente falsificada.

Es posible utilizar $_SERVER["REMOTE_ADDR"] también, este es el valor más seguro, pero también es posible falsificación. Este remote_addr es la dirección donde Apache vuelve a consecuencia.

Si usted quiere tener un lista blanca / AllowList que los apoyos direcciones IP estática 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 se podría establecer una lista de nombres / IP que será capaz (con seguridad) a detectar. nombres dinámicos añaden más flexibilidad para acceder desde diferentes puntos.

Existen dos opciones comunes aquí, podría configurar un nombre en sus archivo de hosts local o usted podría utilizar una dinámico proveedor de nombre que se podría encontrar en cualquier lugar.

Esta función tiene como resultado cachés porque Gethostbyname es una función muy lento.

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 fiabilidad que podría reemplazar el $ _ SERVER [ 'REMOTE_ADDR'] get_ip_address () que @Pekka mencionó en su post como "esta pregunta recompensa"

Lo siento, pero todas estas respuestas parecen terribles para mí. Yo sugeriría que reformular la pregunta porque en cierto sentido todas las máquinas son "localhost".

La pregunta debería ser; ¿Cómo realizar diferentes rutas de código dependiendo de qué máquina se ejecuta en.

En mi opinión, la forma más fácil es crear un archivo llamado DevMachine o lo que usted quiere realmente y luego simplemente marque

  

file_exists ( 'DevMachine')

Recuerde que debe excluir este archivo para la carga en el entorno de alojamiento en directo!

Esta solución no está en función de la configuración de red, no se puede suplantar y hace que sea fácil cambiar entre correr "en vivo de código" y "dev-código".

¿Qué hay de comparar $_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR'] para determinar si el cliente está en la misma máquina que el servidor?

He encontrado una respuesta fácil.

Debido a que todas las unidades locales tienen C: o D: o F:. Etc ...

Sólo detectar si el segundo personaje es un:

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';
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top