2010-01-12 10 views

Respuesta

119

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 
} 
+2

Lo que haría esto realmente más fácil de romper que suplantar el IP. Realmente deberías cambiarlo. –

+0

Esto no funciona para mí. $ _SERVER ['HTTP_HOST'] devuelve la parte textual de mi dominio (por ejemplo, "ejemplo" si el dominio fuera www.example.com). – skcin7

+3

@ skcin7 podría ser su configuración de servidor. revisalo. – mauris

14

$_SERVER["REMOTE_ADDR"] debería decirle la IP del usuario. Es spoofable, sin embargo.

Compruebe this bounty question para una discusión muy detallada.

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

+0

Guau, parece que hay mucho más en esta pregunta de lo que pensaba ... –

+0

Vale la pena señalar que algunos servidores MySQL están configurados así porque no se vinculan a una interfaz pública. Del mismo modo, si desea restringir una aplicación PHP de la misma manera, debe considerar la posibilidad de publicarla a través de una instancia de apache vinculada solo a una interfaz interna. –

6

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

También puede usar $_SERVER["REMOTE_ADDR"], este es el valor más seguro, pero también es posible simular. Esta remote_addr es la dirección donde Apache devuelve el resultado.

+0

'REMOTE_ADDR' es posible falsificar, sin embargo, si quiere fingirlo como' 127.0.0.1' o ':: 1', eso requiere comprometer la máquina, en la cual un' REMOTE_ADDR' falso es la menor de sus preocupaciones. Respuesta relevante: http://stackoverflow.com/a/5092951/3774582 – Goose

13

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 
} 
15

Como complemento, en función ...

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

Como buena práctica, recomendaría agregar "else return false;" para que la función siempre devuelva un valor booleano. O alternativamente, simplemente elimine completamente el "si" y en su lugar "devuelva in_array ($ _SERVER ['REMOTE_ADDR'], $ whitelist);" –

0

Si usted quiere tener un lista blanca/AllowList que soporta 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 /IPS que serán capaces (con seguridad) para ser detectados. Los nombres dinámicos agregan más flexibilidad para acceder desde diferentes puntos.

tiene dos opciones comunes aquí, podría configurar un nombre en sus archivo Hosts local o usted podría utilizar un proveedor de dinámica de nombres que se podría encontrar en cualquier lugar.

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

Por esta 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'] para la get_ip_address() que @Pekka mencionado en su post como "esta pregunta de generosidad"

+0

No sé por qué alguien estableció un puntaje negativo en mi respuesta, mientras que claramente ofrece 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

-1

Encontré una respuesta fácil.

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

Sólo detectar si el segundo carácter 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'; 
} 
+0

Esto funciona solo en Windows –

0

Como punto de comparación para determinar si $_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR'] el cliente está en la misma máquina que el servidor?

Cuestiones relacionadas