Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] error, me activan los mensaje al validar la sesion

Estas en el tema de error, me activan los mensaje al validar la sesion en el foro de PHP en Foros del Web. saludos amigos me estoy migrando a PDO y he tratado de hacer este archivo para validar las sesiones de usuarios pero tengo un problema que ...
  #1 (permalink)  
Antiguo 11/12/2016, 22:54
Avatar de aviweb2015  
Fecha de Ingreso: abril-2016
Ubicación: venezuela
Mensajes: 215
Antigüedad: 8 años, 1 mes
Puntos: 1
error, me activan los mensaje al validar la sesion

saludos amigos me estoy migrando a PDO y he tratado de hacer este archivo para validar las sesiones de usuarios pero tengo un problema que se me activan las alertas de los mensajes al darle click al boton aceptar pero el problema es que el user y el pass estan bien, si estuviera mal puesto cualquiera de los dos datos tendría que dar la alerta a lo que correspondes pero no es así. no se si es que estoy haciendo algo mal o me falta algo pero ya o veo donde tengo el error, si podrían echarme una manito se los agradecería ah otra cosa y si es posible mejorar un poco mas la seguridad o estaría bien así, siempre es bien tomar consejos de otras personas

Código:
¡ Ups Aviso: Usuario Incorrecto !

¡ Ups Aviso: Contraseña incorrecta !

¡ Ups Aviso: Contraseña incorrecta !

¡ Ups Aviso: Contraseña incorrecta !


Código PHP:
Ver original
  1. <?php
  2.  
  3. include("conexion/conexion.php");
  4.  
  5.  
  6. $user = $_POST['user'];  
  7. $password = $_POST['password'];
  8.  
  9.  
  10. $user_check = $DB_con->prepare('SELECT user FROM user WHERE user = :user LIMIT 1');
  11. $user_check->bindParam(':user', $_POST['user']);
  12. $user_check->execute();
  13. if($user_check->rowCount() > 0){ ?>
  14.  
  15.  
  16. <div class='col s12 card-panel blue lighten-2 center'>
  17. <h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ Ups Aviso: Usuario Incorrecto !
  18. </h5>
  19. <?php header("refresh:5;login.php"); ?>
  20. </div>
  21.  
  22.  
  23.  
  24. <?php
  25.  
  26.         }
  27.  
  28. $hash_password= hash('sha256', $_POST['password']);
  29. $sql = $DB_con->prepare('SELECT * FROM user WHERE user = :user AND
  30. password = :password AND idnivel = \'Administrador\'  LIMIT 1');
  31. $sql->bindParam(':user', $_POST['user']);
  32. $sql->bindParam(':password', $_POST['password']);
  33. $sql->execute();
  34. $sql->closeCursor();
  35. if($sql->rowCount()){
  36.  
  37.  
  38.  
  39.  
  40. $_SESSION['id'] = $id;
  41. $_SESSION['correo'] = $correo;
  42. $_SESSION['idnivel'] = 'Administrador';
  43. $_SESSION['Administrador'] = $clave;
  44. $_SESSION['nombres'] = $row['nombres'] . ' ' . $row['apellidos'];
  45.  
  46.  
  47. ?>
  48.  
  49.  
  50. <?php header("Location: admin/home.php"); ?>
  51.  
  52.  
  53. <?php  } else {  ?>
  54.  
  55.  
  56. <div class='col s12 card-panel blue lighten-2 center'>
  57. <h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ Ups Aviso: Contraseña incorrecta !
  58. </h5>
  59. <?php header("refresh:5;login.php"); ?>
  60. </div>
  61.  
  62.  
  63.  
  64. <?php
  65.  
  66.  
  67.         }
  68.  
  69. $hash_password= hash('sha256', $_POST['password']);
  70. $sql = $DB_con->prepare('SELECT * FROM user WHERE user = :user AND
  71. password = :password AND idnivel = \'Usuarios\'  LIMIT 1');
  72. $sql->bindParam(':user', $_POST['user']);
  73. $sql->bindParam(':password', $_POST['password']);
  74. $sql->execute();
  75. $sql->closeCursor();
  76. if($sql->rowCount()){
  77.  
  78.  
  79.  
  80.  
  81. $_SESSION['id'] = $id;
  82. $_SESSION['correo'] = $correo; //muestra el login
  83. $_SESSION['idnivel'] = 'Secretarias'; //muestra el nivel del usuario
  84. $_SESSION['Secretarias'] = $correo;
  85. $_SESSION['nombres'] = $row['nombres'] . ' ' . $row['apellidos'];
  86. $_SESSION['cedula'] = $row['cedula'];
  87.  
  88.  
  89. ?>
  90.  
  91.  
  92. <?php header("Location: secretaria/home.php"); ?>
  93.  
  94.  
  95. <?php  } else {  ?>
  96.  
  97.  
  98. <div class='col s12 card-panel blue lighten-2 center'>
  99. <h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ Ups Aviso: Contraseña incorrecta !
  100. </h5>
  101. <?php header("refresh:5;login.php"); ?>
  102. </div>
  103.  
  104.  
  105. <?php
  106.        
  107.         }
  108.  
  109. $hash_password= hash('sha256', $_POST['password']);
  110. $sql = $DB_con->prepare('SELECT * FROM user WHERE user = :user AND
  111. password = :password AND idnivel = \'Secretarias\'  LIMIT 1');
  112. $sql->bindParam(':user', $_POST['user']);
  113. $sql->bindParam(':password', $_POST['password']);
  114. $sql->execute();
  115. if($sql->rowCount()){
  116.  
  117.  
  118.  
  119.  
  120. $_SESSION['id'] = $id;
  121. $_SESSION['correo'] = $correo;
  122. $_SESSION['idnivel'] = 'Usuarios';
  123. $_SESSION['Usuarios'] = $correo;
  124. $_SESSION['nombre'] = $row['nombre'] . ' ' . $row['apellido'];
  125.  
  126. ?>
  127.  
  128.  
  129. <?php header("Location: usuarios/home.php"); ?>
  130.  
  131.  
  132. <?php  } else {  ?>
  133.  
  134.  
  135. <div class='col s12 card-panel blue lighten-2 center'>
  136. <h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ Ups Aviso: Contraseña incorrecta !
  137. </h5>
  138. <?php header("refresh:5;login.php"); ?>
  139. </div>
  140.  
  141.  
  142. <?php
  143. }
  144.  
  145. $sql = null;
  146. $DB_con = null;
  147.  
  148. ?>
__________________
yoclens avilan
  #2 (permalink)  
Antiguo 12/12/2016, 02:04
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: error, me activan los mensaje al validar la sesion

Pon un exit justo después de cada redireccion, para que no se ejecute el resto del código.

Igualmente fijándome un poco más en el código, no veo la necesidad de realizar 3 pruguntas a la misma tabla una por cada tipo de usuario, si tuviésemos 10 tipos/niveles, hacemos 10 consultas? Deberías de hacer una única consulta, quitando del where idnivel de la consulta, luego si el usuario y la contraseña son correctas, hace un switch o if/elseif con el idnivel devuelto para Redireccionar al sitio deseado, ahorras un montón de código duplicado y en caso de agregar más tipos/niveles solo tienes que agregar una condición más.


Sea como sea ten en cuenta que header es una cabecera y debe ser enviada antes de cualquier otra cosa al navegador, por lo que en tu código lo tienes mal.
Un ejemplo:

Esto esta mal
Código PHP:
<div class='col s12 card-panel blue lighten-2 center'>
<h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ Ups Aviso: Usuario Incorrecto !
</h5>
<?php header("refresh:5;login.php"); ?>
</div>
Esto sería correcto:
Código PHP:
<?php header("refresh:5;login.php"); ?>
<div class='col s12 card-panel blue lighten-2 center'>
<h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ Ups Aviso: Usuario Incorrecto !
</h5>
</div>
__________________
Unset($vida['malRollo']);

Última edición por xerifandtomas; 12/12/2016 a las 02:32
  #3 (permalink)  
Antiguo 12/12/2016, 02:45
Avatar de aviweb2015  
Fecha de Ingreso: abril-2016
Ubicación: venezuela
Mensajes: 215
Antigüedad: 8 años, 1 mes
Puntos: 1
Respuesta: error, me activan los mensaje al validar la sesion

gracias ahora si trabaja bien,


Código PHP:
Ver original
  1. <?php header("refresh:5;login.php");
  2. ?>


pero pero hay un problema como estoy usando

Código:
$hash_password= hash('sha256', $_POST['password']);
cuando trato de iniciar sesion con la contraseña normal ejemplo

Código:
usuario: user 
pass: Aviweb2016-

me dice que contraseña incorrecta pero si le ingreso la generada por el hash que se guardad en la bd que seria:

Código:
946eb447476dcb1bc7a30d8c51dc70d8d9c2ddcddb2a6c2290964073a9613af6
si entra perfectamente como si no estuviera descifrando el password
__________________
yoclens avilan
  #4 (permalink)  
Antiguo 12/12/2016, 03:01
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: error, me activan los mensaje al validar la sesion

Hola aviweb2015,

Eso es porque la comparación la estás haciendo directamente sin encriptar la contraseña que recibes del formulario antes de esto.

Código PHP:
Ver original
  1. $sql->bindParam(':password', hash('sha256', $_POST['password']));

Creo que sería algo así...
  #5 (permalink)  
Antiguo 12/12/2016, 03:04
Avatar de aviweb2015  
Fecha de Ingreso: abril-2016
Ubicación: venezuela
Mensajes: 215
Antigüedad: 8 años, 1 mes
Puntos: 1
Respuesta: error, me activan los mensaje al validar la sesion

Cita:
Iniciado por xerifandtomas Ver Mensaje

Igualmente fijándome un poco más en el código, no veo la necesidad de realizar 3 pruguntas a la misma tabla una por cada tipo de usuario, si tuviésemos 10 tipos/niveles, hacemos 10 consultas? Deberías de hacer una única consulta, quitando del where idnivel de la consulta, luego si el usuario y la contraseña son correctas, hace un switch o if/elseif con el idnivel devuelto para Redireccionar al sitio deseado, ahorras un montón de código duplicado y en caso de agregar más tipos/niveles solo tienes que agregar una condición más.
esto si es verdad que no lo hecho me podrás dar un ejemplo de como debería aplicarlo, para así ahorrarme todo ese montón de codigo...
__________________
yoclens avilan
  #6 (permalink)  
Antiguo 12/12/2016, 03:10
Avatar de aviweb2015  
Fecha de Ingreso: abril-2016
Ubicación: venezuela
Mensajes: 215
Antigüedad: 8 años, 1 mes
Puntos: 1
Respuesta: error, me activan los mensaje al validar la sesion

Cita:
Iniciado por rbczgz Ver Mensaje
Hola aviweb2015,

Eso es porque la comparación la estás haciendo directamente sin encriptar la contraseña que recibes del formulario antes de esto.

Código PHP:
Ver original
  1. $sql->bindParam(':password', hash('sha256', $_POST['password']));
venga tio gracias me ha servido jejejeje solo me faltaría un ejemplo de xerifandtomas a ver como puedo reducir mas mi código y mejorarlo mas
__________________
yoclens avilan

Última edición por aviweb2015; 12/12/2016 a las 03:12 Razón: ortografia
  #7 (permalink)  
Antiguo 12/12/2016, 03:22
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: error, me activan los mensaje al validar la sesion

Hola aviweb2015,

Creo que xerifandtomas se refiere a esto, en lugar de así:

Código PHP:
Ver original
  1. $sql = $DB_con->prepare('SELECT * FROM user WHERE user = :user AND
  2. password = :password AND idnivel = \'Administrador\'  LIMIT 1');

Código PHP:
Ver original
  1. $sql = $DB_con->prepare('SELECT * FROM user WHERE user = :user AND
  2. password = :password LIMIT 1');

De esa forma, luego compruebas el nivel recibido con el que debe tener y rediriges a donde te convenga, mediante un switch o if/elseif:

Código PHP:
Ver original
  1. switch ($idnivel) {
  2.  
  3.       case "Administrador":
  4.             header ("Location: pagina_de_administrador");
  5.       break;
  6.       //El resto de código que proceda...

Espero que te sirva...
  #8 (permalink)  
Antiguo 12/12/2016, 07:30
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: error, me activan los mensaje al validar la sesion

Básicamente lo que te ha comentado el compañero rbczgz.

Estoy fuera de casa pero cuando llege si quieres hacemos un ejemplo completo.
__________________
Unset($vida['malRollo']);
  #9 (permalink)  
Antiguo 12/12/2016, 10:25
Avatar de aviweb2015  
Fecha de Ingreso: abril-2016
Ubicación: venezuela
Mensajes: 215
Antigüedad: 8 años, 1 mes
Puntos: 1
Respuesta: error, me activan los mensaje al validar la sesion

ok espero entonces y gracias por responder
__________________
yoclens avilan
  #10 (permalink)  
Antiguo 12/12/2016, 14:56
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: error, me activan los mensaje al validar la sesion

Buenas noches.

Te dejo el ejemplo por aquí, obviamente no lo he probado y puede que contenga algún error, pero creo que te puedes hacer una idea.

Hay algunas variables que no se a que hacen referencia y simplemente las he comentado y otras que he supuesto que extraes de la base de datos pero no estoy seguro ya que en el código que pasaste no estaban definidas en ningún lugar.

Espero que te sea de ayuda.

Un saludo.

Código PHP:
<?php
include("conexion/conexion.php");

// Preparamos la consulta y la ejecutamos 
$sql $DB_con->prepare('SELECT * FROM user WHERE user = :user AND password = :password LIMIT 1');
$sql->bindParam(':user'$_POST['user']);
$sql->bindParam(':password'hash('sha256'$_POST['password']));
$sql->execute();
$sql->closeCursor();
// Comprobamos si ha devuelto algun registro
if($sql->rowCount()>0){
    
// Inicimaos sesion
    
session_start();
    
// Recuperamos los datos de la consulta 
    
$row $sql->fetch(PDO::FETCH_ASSOC);
    
//definimos las variables necesarias para la sesion
    
$_SESSION['id'] = $row['id'];
    
$_SESSION['correo'] = $row['correo'];
    
$_SESSION['idnivel'] = $row['idnivel'];
    
$_SESSION['nombres'] = $row['nombres'].' ' .$row['apellidos'];
    
$_SESSION['cedula'] = $row['cedula'];
    
// Redirigimos la pagina segun idnivel
    
switch ($_SESSION['idnivel']) {
        case 
'Administrador':
            
header("Location: admin/home.php");
            exit;
            break;
        case 
'Usuarios':
            
header("Location: usuarios/home.php");
            exit;
            break;
        case 
'Secretarias':
            
header("Location: secretaria/home.php");
            exit;
            break;
        
// Definimos que hacemos en caso de no detectar ningun idnivel valido
        
default:
            
header("refresh:5;login.php");
            
?>
            <div class='col s12 card-panel blue lighten-2 center'>
            <h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ No se pudo determinar el nivel del usuario !</h5>
            </div>
            <?php
            session_destroy
();
            exit;
            break;
    }
    
/* Estas 3 variables no se a que hacen referencia ni de donde salen */
    /*
    $_SESSION['Administrador'] = $clave;
    $_SESSION['Secretarias'] = $correo;
    $_SESSION['Usuarios'] = $correo;
    */
}
// Definimos que hacemos en caso de que la consulta no haya devuelto ningun resultado
// Es decir en caso de que la contraseña y el usuario sean incorrectos
else{
    
header("refresh:5;login.php"); 
    
?>
    <div class='col s12 card-panel blue lighten-2 center'>
    <h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ Ups Aviso: Contraseña o usuario incorrectos !
    </h5>
    </div> 
    <?php
    
exit;
}
:
__________________
Unset($vida['malRollo']);
  #11 (permalink)  
Antiguo 12/12/2016, 17:50
Avatar de aviweb2015  
Fecha de Ingreso: abril-2016
Ubicación: venezuela
Mensajes: 215
Antigüedad: 8 años, 1 mes
Puntos: 1
Respuesta: error, me activan los mensaje al validar la sesion

gracias por tu ejemplo lo he probado y el único error que me da es que ¡ No se pudo determinar el nivel del usuario !, pero en cuanto lo demás tenias razón se redujo mucho el código jejeje gracias
__________________
yoclens avilan
  #12 (permalink)  
Antiguo 12/12/2016, 18:23
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: error, me activan los mensaje al validar la sesion

He utilizado los nombres que aparentemente estabas utilizando para determinar el idnivel, pero los casos del switch deben de coincidir con lo que tengas en la base de datos.
__________________
Unset($vida['malRollo']);
  #13 (permalink)  
Antiguo 12/12/2016, 18:54
Avatar de aviweb2015  
Fecha de Ingreso: abril-2016
Ubicación: venezuela
Mensajes: 215
Antigüedad: 8 años, 1 mes
Puntos: 1
Respuesta: error, me activan los mensaje al validar la sesion

si eso son los que tengo registrados en la tabla user
tengo estos datos: id,user, password y idnivel

y en mi tabla nivel tengo: id, nivel y ambas relacionadas
__________________
yoclens avilan
  #14 (permalink)  
Antiguo 13/12/2016, 02:32
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: error, me activan los mensaje al validar la sesion

Supongo que ya lo has solucionado, pero por si acaso:

Código PHP:
    $_SESSION['idnivel'] = $row['idnivel']; //aquí asignando recuperando el id nivel de la base de datos 
Después
Código PHP:
// aquí vamos a comparar lo que nos ha devuelto la base de datos como idnivel
    
switch ($_SESSION['idnivel']) {
        case 
'Administrador'// Lo que contiene idnivel debe coincidir con los casos del switch 
            
header("Location: admin/home.php");
            exit;
            break; 
Nose muy bien lo que te devuelve idnivel si es un String o un Int, si es una cadena debes tener en cuenta que el switch es case-sensitive pero puedes utilizar por ejemplo strtolower() para convertir todo a minúsculas antes, y poner todos los caso en minúsculas también. Entiendo que idnivel contiene una cadena.

Código PHP:
    switch (strtolower($_SESSION['idnivel'])) {//convertimos idnivel a minúsculas para comparar
        
case 'administrador'// cambiamos los case a minúsculas también 
            
header("Location: admin/home.php");
            exit;
            break; 
__________________
Unset($vida['malRollo']);

Última edición por xerifandtomas; 04/03/2017 a las 08:09

Etiquetas: mensaje, select, sql, usuario
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 10:16.