Foros del Web » Programando para Internet » PHP »

Autenticación de Usuarios - A ver si lo hice bien.

Estas en el tema de Autenticación de Usuarios - A ver si lo hice bien. en el foro de PHP en Foros del Web. Hola a todos! Estuve dando vueltas por el foro tratando de armar una parte de mi sitio con usuario y pass pero hay cosas que ...
  #1 (permalink)  
Antiguo 26/05/2008, 11:35
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años
Puntos: 1
Autenticación de Usuarios - A ver si lo hice bien.

Hola a todos! Estuve dando vueltas por el foro tratando de armar una parte de mi sitio con usuario y pass pero hay cosas que no sé si las hice bien y esto es una recopilación que hice y estoy probando. Por eso quería ponerles mis códigos y si pueden, acepto todas las correcciones y sugerencias para poder ajustarlo lo mejor posible. Veamos.

login.php
Código PHP:
include('conectar.php');

if(!isset(
$_SESSION[usuario]) )
{

echo 
'<form action="autentificar.php" method="POST">
        Nick: <input type="text" name="nick" size="30"><br>
        Password: <input type="password" name="pass" size="30" ><br>
      <input type="submit" name="submit" value="Enviar"></form>'
;

}else{

echo 
'Bienvenido '.$_SESSION[usuario];
echo 
'<br>Tu nivel es '.$_SESSION[nivel];
if(
$_SESSION[nivel] == 1)
{
header('Location: paginaprivada.php');
}
echo 
'<br><a href=logout.php>Salir</a>'

autenticar.php
Código PHP:
include('conectar.php');

if( (
$_POST[nick] == ' ') or ($_POST[pass] == ' ') )
{
Header("Location:login.php");
}else{

//comprobamos en la db si existe ese nick con esa pass
$usuarios=mysql_query("SELECT * FROM usuarios WHERE nick_usuario='$_POST[nick]' and password_usuario='$_POST[pass]' ");
if(
$user_ok mysql_fetch_array($usuarios))
{

session_register("usuario");
session_register("idusuario");
session_register("nivel");

$_SESSION[usuario] = $user_ok["nick_usuario"];
$_SESSION[codusuario] = $user_ok["id_usuario"];
$_SESSION[nivel] = $user_ok["nivel_usuario"];

Header("Location: login.php");

}else{
echo 
'Nick y pass incorrectos';
}


Básicamente esto es lo que hice pero quisiera preguntarles:
- ¿Así está bien o hay otra forma de hacerlo? ¿se podría hacer algo "un poco más seguro"?
- ¿como hacer para que no se pueda entrar desde el navegador tipeando las direcciones de las páginas privadas? ¿se puede restringir por ejemplo llamando a la session iniciada con un include?

Gracias de entemano y saludos para todos. Marx.
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #2 (permalink)  
Antiguo 26/05/2008, 11:47
 
Fecha de Ingreso: mayo-2008
Mensajes: 16
Antigüedad: 16 años
Puntos: 0
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

Para evitar que te entren a las paginas privadas puedes hacer uso de las variables de session.
En el momento en el que te autenticas haces esto:

Código PHP:
  session_start();
  
$_SESSION['user'] = $usuario//seria por ejemplo el login del usuario autenticado 
Luego en cada una de tus pagina privadas tienes que hacer lo siguiente:
Código PHP:
  session_start();
  if (
$_SESSION['user'] == "")
    
header(Locationindex.php); //o a cualquier pagina que quieras 
  
else
    
// si entra aqui significa que esta accediendo un usuario autenticado 
  #3 (permalink)  
Antiguo 26/05/2008, 12:09
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años
Puntos: 1
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

Hola! Gracias por responder tan pronto. Diganme una cosa... con esto que me has agregado, ¿está bien lo que he hecho? ¿Es necesario modificar alguna otra cosa más?

Muchas gracias. Marx.
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #4 (permalink)  
Antiguo 26/05/2008, 12:23
 
Fecha de Ingreso: mayo-2008
Mensajes: 16
Antigüedad: 16 años
Puntos: 0
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

Asi como esta te va a funcionar. Si quieres lo puedes modificar y guardar en la variable de sesion lo que quieras. Date cuenta que la variable de sesion se utliza para guardar info que quieras conservar durante la navegacion. X ejemplo: Tienes un sitio donde es posible entrar en varios idiomas, una variable de sesion puede ser perfectamente el idioma.O tmb puede ser un objeto. Pueden existir varias variables de sesion lo que por supuesto con nombres diferentes.
La declaracion siempre tiene que ser asi:

$_SESSION['nombre que le quieras poner'] = $informacion;
  #5 (permalink)  
Antiguo 26/05/2008, 12:56
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años
Puntos: 1
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

Cita:
Iniciado por krasburn Ver Mensaje
Para evitar que te entren a las paginas privadas puedes hacer uso de las variables de session.
En el momento en el que te autenticas haces esto:

Código PHP:
  session_start();
  
$_SESSION['user'] = $usuario//seria por ejemplo el login del usuario autenticado 
Luego en cada una de tus pagina privadas tienes que hacer lo siguiente:
Código PHP:
  session_start();
  if (
$_SESSION['user'] == "")
    
header(Locationindex.php); //o a cualquier pagina que quieras 
  
else
    
// si entra aqui significa que esta accediendo un usuario autenticado 
Gracias otra vez. Me quedó por preguntarte algo... estas líneas que me has pasado, ¿van en autenticar.php? ¿Sería así?
Código PHP:
include('conectar.php');

if( (
$_POST[nick] == ' ') or ($_POST[pass] == ' ') )
{
Header("Location:login.php");
}else{

//comprobamos en la db si existe ese nick con esa pass
$usuarios=mysql_query("SELECT * FROM usuarios WHERE nick_usuario='$_POST[nick]' and password_usuario='$_POST[pass]' ");
if(
$user_ok mysql_fetch_array($usuarios))
{

session_register("usuario");
session_register("idusuario");
session_register("nivel");

  
session_start(); // ¿Esta línea va aquí? 
  
$_SESSION['user'] = $usuario// esta línea corresponde a lo que está abajo?

$_SESSION[usuario] = $user_ok["nick_usuario"];
$_SESSION[codusuario] = $user_ok["id_usuario"];
$_SESSION[nivel] = $user_ok["nivel_usuario"];

Header("Location: login.php");

}else{
echo 
'Nick y pass incorrectos';
}


- ¿Está bien ubicado el session_start()?
- La linea que va en las páginas privadas, ¿la puedo llamar desde un include?

Gracias otra vez.
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #6 (permalink)  
Antiguo 26/05/2008, 13:17
 
Fecha de Ingreso: mayo-2008
Mensajes: 16
Antigüedad: 16 años
Puntos: 0
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

El primer codigo lo pondrias en el autenticar.php pq es donde sabes el usuario que acaba de loguearse en tu sitio.
El segundo codigo seria valido para cualquiera de tus paginas que consideres como privadas. O sea que no quieras que accedan a ella escribiendo simplemente la url en el navegador.
La llamada a session_start() tiene que antes de acceder a las variables de sesion, aunque yo acostumbro siempre a pornerla en al principio, exactamente detras de los include.
  #7 (permalink)  
Antiguo 26/05/2008, 13:53
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años
Puntos: 1
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

Listo amigo. Ya me funcionó todo perfectamente y también probé haciendo un include de un archivo externo que contenga la session y tambien funcionó. Y lo de las páginas privadas tambien. Ahora si no estoy logueado me envía directo al form para poder entrar.

Un 1.000.000 de gracias por tu tiempo y sabiduría.

Un abrazo. Marx.
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #8 (permalink)  
Antiguo 26/05/2008, 13:58
Avatar de oso96_2000  
Fecha de Ingreso: junio-2002
Ubicación: Distrito Federal
Mensajes: 558
Antigüedad: 21 años, 10 meses
Puntos: 35
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

Unos detalles:
- No uses mas session_register(). Para asignar una variable de sesion basta con usar $_SESSION['variable'] = $valor;
- Recuerda que los indices asociativos de cualquier arreglo deben ir entre comillas, esto también aplica para los superglobales. Por ejemplo, en lugar de poner $_SESSION[user] deberías poner $_SESSION['user'], $_POST['nick] debe ser $_POST['nick']
- Donde comparas para que no estén vacíos el usuario y contraseña, estas comparando con un espacio en blanco, pero debería ser con cadena vacía (y aplicando trim() si puedes). Ej.:
Código PHP:
if ($_POST['nick'] == ''){ 
- Al hacer tu consulta, deberías limpiar antes las cadenas para evitar una inyección sql. Ej.:
Código PHP:
$nick mysql_real_escape_string($_POST['nick']);
$pass mysql_real_escape_string($_POST['pass']);
$usuarios mysql_query("SELECT * FROM usuarios WHERE nick_usuario = '$nick' AND password_usuario = '$pass'"); 
Saludos :)

Edito: Ah si, una mas. Para verificar si una variable existe, usa isset. if (isset($_SESSION['user']) en lugar de if ($_SESSION['user'] == '')

Si quieres ver el porque de todo esto, ponte un error_reporting(E_ALL); al comienzo de tu script =P
__________________
Sin Ideas
  #9 (permalink)  
Antiguo 26/05/2008, 14:24
 
Fecha de Ingreso: mayo-2008
Mensajes: 16
Antigüedad: 16 años
Puntos: 0
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

Hola oso96_2000:
No entendi lo que decias de pq es mejor utilizar isset($_SESSION ...) a la otra variante. Que es lo que hay que poner en el script?
Saludos
  #10 (permalink)  
Antiguo 26/05/2008, 14:33
Avatar de oso96_2000  
Fecha de Ingreso: junio-2002
Ubicación: Distrito Federal
Mensajes: 558
Antigüedad: 21 años, 10 meses
Puntos: 35
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

krasburn:
Lo que pasa es que si pones solamente if ($_SESSION['user'] == ''), y la variable de sesión no existe, entonces te tirará un notice de "Undefined index:". Por eso es mejor comprobar que la variable exista con isset y luego, si se quiere, ver que no este vacia.

Código PHP:
if (!isset($_SESSION['user']) || $_SESSION['user'] == ""
Si la variable de sesion no existe, entra al if y ya no hace la segunda comprobación. Si existe, entonces lo que hace ahora es revisar que no este vacia.

Mira, prueba poniendo en una pagina esto y ejecutandola:
Código PHP:
<?php
error_reporting
(E_ALL);
session_start();
if (
$_SESSION['user'] == '') echo 'redirigiendo...';
?>
Y ahora poniendo:
Código PHP:
<?php
error_reporting
(E_ALL);
session_start();
if (!isset(
$_SESSION['user']) || $_SESSION['user'] == '') echo 'redirigiendo...';
?>
__________________
Sin Ideas
  #11 (permalink)  
Antiguo 26/05/2008, 15:43
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años
Puntos: 1
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

oso96_2000: quisiera mostrarte como lo he hecho junto con lo que tú me has explicado:

autenticar.php
Código PHP:
include('conectar.php');

$nick mysql_real_escape_string($_POST['nick']);
$pass mysql_real_escape_string($_POST['pass']);

$usuarios mysql_query("SELECT * FROM usuarios WHERE nick_usuario = '$nick' AND password_usuario = '$pass'");

if(
$user_ok mysql_fetch_array($usuarios))
{

$_SESSION['usuario'] = $user_ok["nick_usuario"]; 
$_SESSION['codusuario'] = $user_ok["id_usuario"];
$_SESSION['nivel'] = $user_ok["nivel_usuario"]; 
Header("Location: login.php");

}else{
echo 
'Nick y pass incorrectos';


paginaprivada.php
Código PHP:
session_start();

    if (!isset(
$_SESSION['usuario']) || $_SESSION['usuario'] == "")
    
header("Location: login.php"); //o a cualquier pagina que quieras 
      
else
    
// si entra aqui significa que esta accediendo un usuario autenticado  

    
include('conectar.php');

    echo 
'Bienvenido '.$_SESSION['usuario']; 
Lo he probado y funcionó, salvo que me haya comido alguna modificación. Gracias por las aclaraciones. Un abrazo. Marx.
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #12 (permalink)  
Antiguo 26/05/2008, 15:51
Avatar de oso96_2000  
Fecha de Ingreso: junio-2002
Ubicación: Distrito Federal
Mensajes: 558
Antigüedad: 21 años, 10 meses
Puntos: 35
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

Mmh.. te funcionó así tal cual? me parece raro ya que no tienes un session_start() en el archivo autenticar.php, y sin eso no deberían guardarse las variables de sesion..

Ahora, del paginaprivada.php la forma del if con el que compruebas esta bien, pero la verdad el else sobra. Podria ser simplemente:

Código PHP:
session_start();
if (!isset(
$_SESSION['usuario']) || $_SESSION['usuario'] == "")  {
  
header("Location: login.php");
  exit; 
//Esto suele ser bueno para prevenir que el script haga alguna otra cosa antes de redireccionar
}

//Aqui ya todo el contenido que quieras, puesto que si esta aqui, significa que esta autentificado 
__________________
Sin Ideas
  #13 (permalink)  
Antiguo 13/08/2008, 14:05
 
Fecha de Ingreso: julio-2008
Mensajes: 59
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Autenticación de Usuarios - A ver si lo hice bien.

hola! ya ratos estoy intentando y no me funciona, nunca hace la conexión a mi base de datos y mi página privada no puedo llegar a leerla al momento de la autenticación tengo esto

if (isset($_POST['usuario'])) {
$loginUsername=$_POST['usuario'];
$password=$_POST['clave'];
$MM_fldUserAuthorization = "";
$MM_redirectLoginSuccess = "index.php";
if($MM_redirectLoginSuccess) {$var = "ok";}

y en la página que quiero validar tengo esto:

<?php session_start();?>
<?php if ($_POST['$var'] == "ok")
header("Location: index.php"); //o a cualquier pagina que quieras
else
{header( "Location: login.php");}
?>

cualquier ayuda la agradeceré...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:09.