entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Control de acceso por IP

Hola.

Quisiera agregar un control de acceso por ip en una intranet.
QUiero que al sistema accedan sólo 4 o 5 computadoras con ip fija.

El siguiente código no me funciona, dónde está el error?

<?php 
    $ip = $_SERVER['REMOTE_ADDR']; 

if($ip != "192.168.1.104" || $ip != "192.168.1.103" || $ip != "192.168.1.107"){ 
   exit( "No Autorizado"); 
} else { 
   echo "Bienvenido"; 
    }
?> 

Desde ya muchas gracias!

3 Respuestas

3votos

carlossevi Puntos63580

Hola @top21tk, la comprobación que haces no es correcta ya que por ejemplo el usuario que entra con la IP 192.168.1.107 cumple la siguiente condición $ip != "192.168.1.104" con lo que entraría en el exit() que le deniega el acceso sin importar el resultado del resto de comparaciones ya que las estás combinando con un OR.

Siguiendo con tu método, la condición correcta sería la que incluya operadores AND, es decir, se tienen que cumplir todas las condiciones para denegar el acceso:

<?php 
    $ip = $_SERVER['REMOTE_ADDR']; 

if($ip != "192.168.1.104" && $ip != "192.168.1.103" && $ip != "192.168.1.107"){ 
   exit( "No Autorizado"); 
} else { 
   echo "Bienvenido"; 
}
?> 

En cualquier caso, yo no delegaría este control de acceso al PHP sino que aplicaría reglas en el servidor web. En el caso de Apache podrías configurar un .htaccess con el siguiente contenido:

order deny,allow
deny from all
allow from 192.168.1.104
allow from 192.168.1.103
allow from 192.168.1.107

En ese caso será el propio servidor web el que se encargará de rechazar otras conexiones y te evitas problemas si tu aplicación PHP esté mal codificada en algún punto. Sí que recurriría al PHP en el caso de que otros usuarios sí deban poder acceder a la aplicación pero por ejemplo visualizar otro contenido.

0voto

top21tk comentado

Gracias Carlos, con tu sugerencia logré hacer funcionar el código.
Además de implementar el control con php, como uso nginx (no .htaccess), agregué algunos parámetros al archivo nginx.conf.

http {
    ...
    server {
...
        location / {
            root   html;
            index  index.php index.htm index.html;

# con esto habilito algunas ip y bloqueo el resto
allow 127.0.0.1;
allow 192.168.1.104;
allow 192.168.1.100;
deny  all;
        }
}
}

2votos

ankeorum Puntos7210

También te valdría, y para mí es más lógico, hacerlo de la siguiente forma; permites la entrada a las 3 ips que te interesa y deniegas a todas las demás, en vez de denegar las que no son las que quieres y dejar entrar al resto. Esto sería:

<?php 
    $ip = $_SERVER['REMOTE_ADDR']; 

if($ip = "192.168.1.104" || $ip = "192.168.1.103" || $ip = "192.168.1.107"){ 
   echo "Bienvenido";
} else { 
   exit ("No Autorizado");  
}
?> 

Para mi gusto así es más claro ya que permites que entren las IPs que quieres y deniegas las demás.

0voto

top21tk comentado

Tienes razón con la lógica, lo tendré en cuenta.
Pensé que -de la forma que lo planteas- después de Bienvenido iría todo el código de cada archivo php y por último el mensaje de denegación.

Saludos.

0voto

Leonardo-Tadei comentado

Ojo que la comparación es con == y no solo con =... eso es una asignación y evalúa siempre como verdadero.

1voto

Leonardo-Tadei Puntos227320

Hola,

si vas a hacerlo por software, es más simple y fácil de mantener poner las IP en un array y luego evaluar con in_array():

<?php
$ip[] = "192.168.1.103";
$ip[] = "192.168.1.104";
$ip[] = "192.168.1.107";
$ip_cliente = $_SERVER['REMOTE_ADDR']; 

if( in_array($ip_cliente)){
   print('Bienvenido');
} else { 
  print('No autorizado');
}

Esto te permite mantener más fácil la lista de IPs válidas, que a su vez podrían estar en un archivo de texto y cargarse al vector con la función file():

$ip = file('ips_validas.txt');

Saludos!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta