Foros del Web » Programando para Internet » PHP »

sistema de logueo basico, no me restringe acceso

Estas en el tema de sistema de logueo basico, no me restringe acceso en el foro de PHP en Foros del Web. Hola. Bueno, estoy armando de cero un sistema de usuarios bien simplon para practicar ya que recién estoy empezando. Ahora que ya hice, casi de ...
  #1 (permalink)  
Antiguo 11/08/2011, 21:11
 
Fecha de Ingreso: julio-2009
Mensajes: 77
Antigüedad: 14 años, 9 meses
Puntos: 5
sistema de logueo basico, no me restringe acceso

Hola.

Bueno, estoy armando de cero un sistema de usuarios bien simplon para practicar ya que recién estoy empezando.

Ahora que ya hice, casi de manera de boceto, el sistema de registro, logueo y logout, estoy probando el tema de restringir el acceso a determinadas páginas. Para ello cree un archivo, que pienso usar como include cada vez que quiero restringir una web.
Pero al incluirlo en una página, noto que no la restringe, por lo que en mi sistema de logueo tuve que haber echo cosas mal con las sesiones y no veo qué, aunque tengo unas pistas... Les pongo los códigos en orden del sistema de logueo:

conectar.php (incluido en casi todas las páginas de la web)
Código PHP:
<?php

$conexion 
mysql_connect("localhost""root""pw");
mysql_select_db("basedatos"$conexion);

if (isset(
$_SESSION['logueado']) && isset($_SESSION['usuario']))
{
die();
} else {
session_start();
}

?>
login.php formulario de login
Código PHP:
<html><body><FORM ACTION="log_ver.php" METHOD="post">
Usuario: <INPUT TYPE="text" NAME="logus" SIZE="20" MAXLENGHT="20"> <BR>
Contraseña: <INPUT TYPE="password" NAME="logpw" SIZE="20" MAXLENGHT="20"> <BR>
<
INPUT TYPE="submit" CLASS="boton" VALUE="Entrar">
</
FORM></body></html
log_ver.php procesa el formulario
Código PHP:
<?php

include 'conectar.php';

$logus=$_POST['logus'];
$logpw=$_POST['logpw'];

if (
$_POST['logus'] != "" && $_POST['logpw'] != ""
{
$coincide mysql_query("SELECT id FROM usuarios WHERE nick LIKE '$logus'");
    if (
$fila mysql_fetch_array($coincide)) 
    {
    
$coincide2 mysql_query("SELECT id FROM usuarios WHERE pass LIKE '$logpw'");
        if (
$fila2 mysql_fetch_array($coincide2)) 
        {
        
$_SESSION['logueado'] = "si";
        
$_SESSION['usuario'] = "$logus";
        
header ("Location: log_ok.php");
        } else {
        echo 
"Contraseña incorrecta"// Falta retorno a login usando Javasc
        
}
    } else {
    echo 
"El usuario no existe"// Falta retorno a login usando Javasc
    
}
} else {
echo 
"Debe llenar el formulario para continuar"// Falta retorno a login usando Javasc
}

?>
Bueno, hasta acá estaría logueado.
Luego me deslogueo yendo al archivo log_out.php

Código PHP:
<?php

session_destroy
();
header ("Location: ..\index.php");

?>
Y entro a una página a la que quiero restringirle el acceso y que el mismo sea solo para usuarios registrados. Para ello hago un include en ella al archivo que pongo a continuación (que dicho sea de paso, es el unico archivo al que no le pude poner como include el conectar.php ya que si lo hago me dice que va a ignorar la session que se inicia en el ya que hay una que ya se encuentra iniciada...)

Código PHP:
<?php
//Restringe el acceso a la sección que lo incluya. Se debe estar logueado para entrar.
if ($_SESSION['logueado'] = 'si'
{
echo 
"Hola ¡Gracias por visitarnos!"
// falta redirreccionar
} else {
header ("Location: login.php");
}

?>
Yo creo que hay cosas mal en log_ver.php en la parte en que creo 2 variables de session y le asigno valores... me saltee algo importante por ahí, mi experiencia con sesiones es CERO..
Gracias desde ya por su ayuda.

Última edición por Trapar; 11/08/2011 a las 22:03
  #2 (permalink)  
Antiguo 11/08/2011, 22:44
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: sistema de logueo basico, no me restringe acceso

No puedes usar sesiones si al principio antes de usarlas no colocas session_start()

http://www.php.net/manual/es/function.session-start.php

La idea mas o menos es crear un archivo login.php que verifica en la base de datos si el usuario y contraseña existen y son correctos. De ser así creas la sesión por ejemplo:

Código PHP:
Ver original
  1. session_start(); //Siempre que vayas a usar sessiones
  2.  
  3. $_SESSION['usuario'] = 'andres';
  4. $_SESSION['logeado'] = 'si';

Después de esto en cada página compruebas si existe esta sesión:

Código PHP:
Ver original
  1. <?php
  2.  
  3.  
  4. if (isset($_SESSION['logeado']) == 'si') {
  5.     echo 'Veo contenido solo para registrados';
  6. } else {
  7.     echo 'Solo usuarios registrados';
  8. }

Más o menos una pista ^^ como siempre inténtalo y publica tus dudas.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 11/08/2011 a las 22:51 Razón: Mas informacion
  #3 (permalink)  
Antiguo 11/08/2011, 22:52
 
Fecha de Ingreso: julio-2009
Mensajes: 77
Antigüedad: 14 años, 9 meses
Puntos: 5
Respuesta: sistema de logueo basico, no me restringe acceso

Pero el session_start() está en todas las páginas que puse menos en el log_out (y en la de restringir acceso) El resto tiene el include conectar.php que a su vez tiene el session_start.

El script que restringe el acceso (el último archivo que puse) no tiene el session_start porque al ponerlo me sale lo siguiente:
Notice: A session had already been started - ignoring session_start() in C:\.............................\log_req.php on line 3
  #4 (permalink)  
Antiguo 11/08/2011, 22:54
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: sistema de logueo basico, no me restringe acceso

Un ejemplo de destruir sessiones, como vez empieza con session_start

Código PHP:
Ver original
  1. <?php
  2. // Inicializar la sesión.
  3. // Si está usando session_name("algo"), ¡no lo olvide ahora!
  4.  
  5. // Destruir todas las variables de sesión.
  6. $_SESSION = array();
  7.  
  8. // Si se desea destruir la sesión completamente, borre también la cookie de sesión.
  9. // Nota: ¡Esto destruirá la sesión, y no la información de la sesión!
  10. if (ini_get("session.use_cookies")) {
  11.     $params = session_get_cookie_params();
  12.     setcookie(session_name(), '', time() - 42000,
  13.         $params["path"], $params["domain"],
  14.         $params["secure"], $params["httponly"]
  15.     );
  16. }
  17.  
  18. // Finalmente, destruir la sesión.
  19. ?>

Edit: No me parece buena idea ese archivo conectar.php para manejar las sesiones.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 11/08/2011 a las 23:23
  #5 (permalink)  
Antiguo 11/08/2011, 23:24
 
Fecha de Ingreso: julio-2009
Mensajes: 77
Antigüedad: 14 años, 9 meses
Puntos: 5
Respuesta: sistema de logueo basico, no me restringe acceso

Gracias andrés, voy a chequear ese logout que pusiste :)

En verdad yo tenía todas las sesiones iniciadas correctamente antes de empezar a tocar para ver si solucionaba el problema...el bucle ese lo cree después.
Ya revisé que estén todas la sesiones iniciadas en todos los archivos y demás y puse el session al principio, y volvi a revisar toda la cadena de codigos, y no veo ningún error, pero al entrar a la página que está restringida por el include de este archivo:

Código PHP:
<?php
//Restringe el acceso a la sección que lo incluya. Se debe estar logueado para entrar.

include 'conectar.php';
if (
$_SESSION['logueado'] = 'si'
{
echo 
"Hola ¡Gracias por visitarnos!"
// falta redirreccionar
} else {
header ("Location: login.php");
}

?>
Me imprime el echo como si la condicion if ($_SESSION['logueado'] = 'si') fuera verdadera, cuando es imposible que lo sea, no solo porque la sesion fue destruida sino porque lo probe en un navegador sin cookies, con la base de datos reiniciada, etcétera, y sucede lo mismo. Por ende, tengo un problema con esa session['logueado'] Creo que hay algo mal en el modo en que registre las sesiones en el login pero veo todo correcto

Código PHP:
<?php

include 'conectar.php';

$logus=$_POST['logus'];
$logpw=$_POST['logpw'];

if (
$_POST['logus'] != "" && $_POST['logpw'] != ""
{
$coincide mysql_query("SELECT id FROM usuarios WHERE nick LIKE '$logus'");
    if (
$fila mysql_fetch_array($coincide)) 
    {
    
$coincide2 mysql_query("SELECT id FROM usuarios WHERE pass LIKE '$logpw'");
        if (
$fila2 mysql_fetch_array($coincide2)) 
        {
        
$_SESSION['logueado'] = "si";
        
$_SESSION['usuario'] = "$logus";
        
header ("Location: log_ok.php");
        } else {
        echo 
"Contraseña incorrecta"// La contraseña es incorrecta
        
}
    } else {
    echo 
"El usuario no existe"// El usuario no existe
    
}
} else {
echo 
"Debe llenar el formulario para continuar"// Debe ingresar ambos datos para continuar
}

?>
  #6 (permalink)  
Antiguo 11/08/2011, 23:27
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: sistema de logueo basico, no me restringe acceso

Como te digo no me parece buena práctica manejar las sesiones con ese archivo conectar.php, simplemente en cada página colocas al inicio session_start() y ya te evitas problemas. Sobre este archivo el error es claro:

Código PHP:
Ver original
  1. <?php
  2. //Restringe el acceso a la sección que lo incluya. Se debe estar logueado para entrar.
  3.  
  4. include 'conectar.php';
  5. if ($_SESSION['logueado'] = 'si')  
  6. {
  7. echo "Hola ¡Gracias por visitarnos!";  
  8. // falta redirreccionar
  9. } else {
  10. header ("Location: login.php");
  11. }
  12.  
  13. ?>

Estas asignando = y necesitas comparar ==. Además te recomiendo que siempre uses funciones como isset() y empty()

Edit: aquí no hacen falta las comillas: $_SESSION['usuario'] = "$logus"; y no se que tal se comporte LIKE en las consultas yo usuaría un igual y ya (=)
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 11/08/2011 a las 23:32
  #7 (permalink)  
Antiguo 11/08/2011, 23:53
 
Fecha de Ingreso: julio-2009
Mensajes: 77
Antigüedad: 14 años, 9 meses
Puntos: 5
Respuesta: sistema de logueo basico, no me restringe acceso

Buenisimo andres gracias!!! Ya funciona como quería :)

-Definitivamente era lo de = vs ==.

-En cuanto a no usar session_start() en el include, por ahora lo saque, pero pienso que para un portal grande sería comodo tenerlo en include, ya que debo estar conectado a la BD en todas las páginas, y a su vez estar con la sesión iniciada en practicamente todas también... pero te haré caso para no marearme.

-Lo de isset() en este caso puntual (si he entendido su uso en otros) no me queda del otro claro si existe una diferencia ... entre
if ($_SESSION['logueado'] == 'si')
y
if (isset($_SESSION['logueado']) = 'si')
Ya que si su valor es 'si' a su vez no va a ser NULL, y viceversa.

-Lo de LIKE voy a consultar si tiene una dif. real con el operador, pero parece que no y que es de uso extensivo, y en el manual de MYSQL no dice nada al respecto contra el mismo, pero si descubro algo pasaré por acá.

Nuevamente gracias, voy a estar más atento a que (=) != (==)

Última edición por Trapar; 12/08/2011 a las 00:02
  #8 (permalink)  
Antiguo 12/08/2011, 00:04
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: sistema de logueo basico, no me restringe acceso

La diferencia entre los 2 es que si entran al archivo sin antes pasar por el logeo, te va a dar un error de tipo Notice la variable $_SESSION no está definida. Para eso sirven empty() y isset().

if ($_SESSION['logueado'] == 'si') Da error si entran a esta página y no está definida la sesión logueado

if (isset($_SESSION['logueado']) == 'si')

Sin hablar de los problemas se seguridad que esto trae. Date una pasada por este link:

http://www.tufuncion.com/php_seguridad_I
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Etiquetas: basico, html, logueo, mysql, registro, sistema, formulario, variables, usuarios
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 08:30.