Ver Mensaje Individual
  #9 (permalink)  
Antiguo 20/11/2015, 07:13
Avatar de kahlito
kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Error haciendo login con contraseña encriptada crypt

Hola de nuevo.

El anterior problema va perfectamente, sin embargo ahora tengo otra duda o error que no logro solucionar.

Si lo hago de esta manera a la hora de editar:

Código HTML:
Ver original
  1. <form method="post" action="inc/confirmar-editar-usuario.php?id=<?php echo $id_usuario; ?>&usuario=<?php echo $usuario;?>" enctype="multipart/form-data" class="form">
  2. <label>Contraseña: </label>
  3.     <input name="contrasena" type="password" class="form-control" value="<?php echo $contrasena; ?>" placeholder="Introduce tu contraseña" required ><br>
  4. <input type="submit" value="Editar" name="editar_usuario" class="submit">
  5. </form>

Aquí en el formulario muestro la contraseña actual encriptada de la base de datos y cuando el usuario la cambia por otro pues la envía y la vuelve a encriptar y todo bien:

Código PHP:
Ver original
  1. $contrasena = $_POST['contrasena'];
  2. //Encripto la contraseña para enviar a la base de datos.
  3.     $hashFormat = "$2y$10$";
  4.     $salt = "iusesomecrazystrings22";
  5.     $hashF_and_salt = $hashFormat . $salt;
  6.     $encript_password = crypt($contrasena, $hashF_and_salt);
  7.     //Fin Encripto la contraseña para enviar a la base de datos.
  8.  
  9.  $query = "UPDATE usuarios SET ";        
  10.         $query .="contrasena = '{$encript_password}' ";      
  11.     $query .="WHERE id_usuario = {$id_usuario} ";
  12.      //print_r($query);          
  13.  
  14.     $editar_usuario_query = mysqli_query($conexion,$query);

Hasta aquí todo bien, pero si el usuario no toca la contraseña se envía la contraseña actual que se muestra en el formulario (encriptada) y claro ya pierde el valor anterior enviando una nueva encriptada.

He probado suponiendo que el campo de la contraseña no se toca o vuelve a estar vacío y así enviaría el antiguo valor a la consulta, pero no me ha servido de nada:

Código PHP:
Ver original
  1. //Si el campo contraseña está vacío busco la anterior contraseña para enviar   
  2.     if(empty($contrasena)){
  3.         echo "Contraseña vacía";               
  4.         $query_password_e = "SELECT contrasena from usuarios WHERE id_usuario = {$id_usuario}";        
  5.         $buscar_contrasena_e = mysqli_query($conexion, $query_password_e);     
  6.         //Si se encuentra la contraseña
  7.         if($fila = mysqli_fetch_array($buscar_contrasena_e))
  8.         {  
  9.             $encript_password = $fila['contrasena'];                   
  10.         }
  11.     }
  12.     //Fin Si el campo contraseña está vacío busco la anterior contraseña para enviar


También lo he intentado creando un campo alternativo, por ejemplo $input_contrasena; (variable sin encriptar que se guarda en la tabla en el campo input_contrasena) y cuando el usuario envíe la contraseña por primera vez al registrarse lo guarde sin encriptar. Luego cuando imprima los datos a la hora de editar lo recoge en el campo contraseña y muestra input_contrasena y así si el usuario no toca dicha contreña vuelve a enviar la contraseña correcta que luego se encriptará, pero claro eso parece que estoy creando de nuevo una contraseña desencriptada y no estoy seguro si es una buena práctica o hay alguna otra solución.

¿Se puede hacer de alguna de estas dos maneras o mejor cambiar a otra alternativa? Espero haberme explicado bien.

Saludos.