Hashing de una contraseña en base de datos

llaumegui -  
 llaumegui -

Hola,

retomo el proyecto de una persona sobre el cual tengo que hacer algunas modificaciones y correcciones, particularmente en materia de seguridad. Una de las misiones es reforzar el hash de la contraseña, así que elegí la función password_hash() en lugar de sha1(). He conseguido que, al crear un usuario, se haga el hash en la base de datos y también funciona para la parte de inicio de sesión.

Pero cuando deseamos restablecer una contraseña, la aplicación envía un correo al usuario con la nueva contraseña y entonces en la tabla user la contraseña recibe una UPDATE, lo que modifica el hash de la contraseña y el problema es que la nueva contraseña se hash en sha1, mientras que estoy usando la función de hash password_hash().

Les muestro los fragmentos de código pertinentes:

Aquí recupero la nueva contraseña que está en una tabla mientras se envía el correo al usuario; el registro se elimina un poco más tarde para no mantener la contraseña en texto claro en la base de datos.

$req = "SELECT id, id_user, new_password FROM reinit_passwd WHERE key_gen = '$key'"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor();

Por lo tanto, la nueva contraseña está en la tabla reinit_passwd (no hash en la tabla) como se vio anteriormente, la recupero, la hash (como pueden ver también intenté con sha256, que tampoco funciona; sha1() es la función utilizada por defecto).

if ($resultat > 0) { $idtempo = $resultat['id_user']; $motdepassetemp = $resultat['new_password']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp);

Y es en este punto donde modifico la contraseña en la tabla user:

$req = "UPDATE user SET password = :password WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor();

A pesar de que uso la función password_hash(), la variable $motdepassehash inserta la contraseña en sha1 en la tabla user.

Si tienen alguna idea de por qué no funciona, lo agradezco.

Sean indulgentes, no siempre es fácil retomar el código de otra persona, gracias de antemano.

Para su información, trabajo en mi localhost de Wamp Server que está conectado a un servidor remoto con el SGBDR MySQL.

Saludos

7 respuestas

  1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
     

    Hola,

    Viendo los fragmentos de código que nos muestras, no hay razón para que esté en sha1.

    Podemos deducir que no estás modificando en el lugar correcto (o que has olvidado algo).

    En lugar de poner solo algunos extractos de código, pégame la integridad de tu archivo (sin olvidar indicar el nombre en caso de que haya varios archivos).


    .
    Cordialmente,
    Jordane

    0
  2. llaumegui
     

    Para tu información, mi mensaje de error llega cuando intento conectarme con la cuenta que reinicié debido a que el UPDATE ha insertado la contraseña en sha1, mientras que para la conexión utilizo password_verify(), lo que parece lógico.

    Aquí están mis 2 funciones que gestionan la reinicialización de una contraseña:

    - Primero aquí recupero el id y el correo que el usuario introduce para solicitar la reinicialización de su contraseña. Luego, si existe, creo una nueva contraseña que guardo en texto claro en una tabla (reinit_passwd) para poder recuperarla más tarde (este registro se elimina más tarde) y luego envío un correo que proporciona un enlace que regresa a la aplicación con un mensaje "su contraseña ha sido reiniciada" (si ha funcionado) y posteriormente recibo otro correo con la nueva contraseña.

    public function motDePasseReinitValid($login, $mail) { $req = "SELECT id, mail, password FROM user WHERE login = '$login' AND mail = '$mail'"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat == false) { Toolbox::ajouterMessageAlerte("Combinación Login / Mail no válida", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/motdepasse"); } else { $char = '1234567890abcdefghijklmnopqrstuvwxyz0123456789'; $key = str_shuffle($char); $longueur = '8'; $possible = '123456789abcdfghjkmnpqrtvwxyzABCDFGHJKLMNPQRTVWXYZ'; $mdp = ''; // esta valor será usado más tarde $longueurMax = strlen($possible); if ($longueur > $longueurMax) { $longueur = $longueurMax; } $i = 0; while ($i < $longueur) { // toma un carácter aleatorio $caractere = substr($possible, mt_rand(0, $longueurMax - 1), 1); $mdp .= $caractere; $i++; } $req = "INSERT INTO reinit_passwd(id_user, key_gen, new_passwd) VALUES(:id_user, :key_gen, :new_password)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $resultat['id'], PDO::PARAM_STR); $stmt->bindValue(":key_gen", $key, PDO::PARAM_STR); $stmt->bindValue(":new_password", $mdp, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); //=====Declaración de los mensajes en formato texto y en formato HTML. $passage_ligne = "\r\n"; $message_txt = "Hola, ha hecho una solicitud de nueva contraseña para el Portal Bl."; $message_html = "<html><head></head><body>Hola,<br /><br /> Ha hecho una solicitud de nueva contraseña para <b>el Portal Bl</b>.<br /><br />Para confirmar la reinicialización de la contraseña, por favor haga clic en el enlace de abajo: <br /><br /><a href=\"http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "\">http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "<a/></body></html>"; //========== //=====Creación de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Definición del asunto. $sujet = "Portal - Contraseña olvidada" . chr(233); //========= //=====Creación del encabezado del correo. $header = "From: \"Portal Bl\"***@***>" . $passage_ligne; $header .= "Reply-to: \"Portal Bl\" ***@***>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Creación del mensaje. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Añadir el mensaje en formato texto. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Añadir el mensaje en formato HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====Cerramos la boundary alternativa. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== if (mail($mail, $sujet, $message, $header)) { Toolbox::ajouterMessageAlerte("Un correo para la reinicialización de la contraseña ha sido enviado", Toolbox::COULEUR_VERTE); header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Fallo en el envío del correo. Por favor, intente de nuevo. Si el problema persiste, contacte con el soporte técnico", Toolbox::COULEUR_ROUGE); } }

    Aquí empezamos por recuperar la nueva contraseña en texto claro. Si existe, recuperamos el correo del usuario. Luego, modifico la contraseña del usuario con un UPDATE que debe guardar NORMALMENTE una contraseña hash con la función password_hash() y no hash en sha1. Después, eliminamos la contraseña en texto claro de la tabla reinit_passwd y enviamos el correo con la nueva contraseña.

    //Función para validar la reinicialización de la contraseña public function motDePasseReinitValidation($key) { $req = "SELECT id, id_user, new_passwd FROM reinit_passwd WHERE key_gen = '$key'"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat > 0) { $idtempo = $resultat['id_user']; $motdepassetemp = $resultat['new_passwd']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp); $req = "SELECT mail FROM user WHERE id = $idtempo"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); $mailtest = $resultatmail['mail']; $req = "UPDATE user SET password = :password WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); $req = " DELETE FROM reinit_passwd WHERE id_user = $idtempo "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $idtempo, PDO::PARAM_INT); $resultatdelete = $stmt->execute(); $stmt->closeCursor(); //=====Declaración de los mensajes en formato texto y en formato HTML. $passage_ligne = "\r\n"; $message_txt = "Hola, ha reinicializado su contraseña para el Portal."; $message_html = "<html><head></head><body>Hola,<br /><br /> Ha reinicializado su contraseña.<br /><br /> Nueva contraseña: " . $motdepassetemp . "<a/></body></html>"; //========== //=====Creación de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Definición del asunto. $sujet = "Portal - Nueva contraseña"; //========= //=====Creación del encabezado del correo. $header = "From: \"Portal\"<***@***>" . $passage_ligne; $header .= "Reply-to: \"Portal\"<***@***>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Creación del mensaje. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Añadir el mensaje en formato texto. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Añadir el mensaje en formato HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====Cerramos la boundary alternativa. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== //=====Envío del correo. if (mail($mailtest, $sujet, $message, $header) && ($resultatdelete != false) && ($resultat != false) && ($resultatmail != false)) { Toolbox::ajouterMessageAlerte("Su contraseña ha sido reinicializada correctamente", Toolbox::COULEUR_VERTE); header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Error en la reinicialización de la contraseña - Código de error: #UM01", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/motdepasse"); } } else { Toolbox::ajouterMessageAlerte("El enlace no ha sido aprobado por nuestro sitio. Por favor, inténtelo de nuevo. Código de error: #UM02", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/motdepasse"); } }

    Quiero decir que estas dos funciones están en la misma página y están, de hecho, una tras otra.

    Aquí hay un poco de lectura para los más valientes, ¡gracias de antemano!

    0
    1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
       

      No veo nada anormal.

      Queda por ver cómo haces la autenticación ahora....

      ¿Pasas bien por password_verify?

      0
      1. llaumegui > jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención  
         

        El problema es que lo veo cambiar la contraseña en la tabla y veo que está almacenada en sha1

        Pero sí, paso por la función password_verify():

        // Función que compara la contraseña de la bdd y la que ingresa el usuario public function isCombinaisonValide($login, $password) { //$password = hash('sha256',$password); //$password = sha1($password); $passwordBD = $this->getPasswordUser($login); // Código de error: #UM04 if (password_verify($password, $passwordBD)) { return true; } else { // descomentar al pasar a producción y comentar la línea de abajo Toolbox::ajouterMessageAlerte("Error al iniciar sesión", Toolbox::COULEUR_ROUGE); Toolbox::ajouterMessageAlerte("Error en la comparación - Código de error: #UM04", Toolbox::COULEUR_ROUGE); return false; } }

        Aquí en parámetro de la función recupero la entrada del usuario.

        Además, funciona cuando me conecto, ya que mientras no restablezca mi contraseña, todo funciona bien.

        El verdadero problema (creo) es por qué al restablecer la contraseña me la inserta en sha1 en mi tabla??

        0
      2. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831 > llaumegui
         

        El código de verificación también me parece correcto.

        ¿Estás seguro de que actualiza la contraseña en tu tabla?

        Una prueba simple...

        Elimina la contraseña existente en la base de datos.

        Ejecuta tu código para cambiarla...

        Mira en tu base de datos si tienes un nuevo valor que se haya inscrito.

        No dudes en agregar también echo / var_dump de tus variables en tu código para ver por dónde pasa tu código y si realmente entra en las funciones que nos muestras.

        Esto también te permitirá ver la contraseña hashada... si es conforme a lo que esperas.

        A propósito, mientras lo pienso, verifica también el tamaño del campo que supuestamente debe contener la contraseña hashada en tu base de datos. ¿Es lo suficientemente grande?

        A propósito... parece que estás usando PDO.

        Sería bueno activar la gestión de errores de PDO en la conexión a tu base de datos Y EN CADA CONSULTA.

        https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

        0
      3. llaumegui > jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención  
         

        Acabo de intentar una vez más y sí, estoy seguro de que mi contraseña se actualiza en mi tabla, cambia la contraseña hash con password_hash() por la nueva contraseña enviada por correo, hash en sha1 (utilizo un sitio después para cifrar en sha1 y verificar que el hash de la nueva contraseña sea efectivamente sha1)

        En cuanto a los errores de PDO, mi conexión a la BD:

        private static function setBdd(){ // BD PROD self::$pdo = new PDO("mysql:host=xxx;dbname=xxxx;charset=utf8","xxxx","password"); self::$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); }

        He intentado poner var_dump() pero creo que los he colocado en los lugares incorrectos porque no he visto nada.

        También añadí esto al principio de mi página pero no hubo cambios:

        error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE);

        Para darte una idea del error:

        y el código que maneja eso detrás:

        // Función que compara la contraseña de la bd y la introducida por el usuario public function isCombinaisonValide($login, $password) { //$password = hash('sha256',$password); //$password = sha1($password); $passwordBD = $this->getPasswordUser($login); if (password_verify($password, $passwordBD)) { var_dump($passwordBD); //el var_dump aquí no me mostró nada al iniciar sesión return true; } else { // comentar esto al pasar a producción y descomentar la línea de abajo Toolbox::ajouterMessageAlerte("Fallo al iniciar sesión", Toolbox::COULEUR_ROUGE); Toolbox::ajouterMessageAlerte("Fallo en la comparación - Código error: #UM04", Toolbox::COULEUR_ROUGE); var_dump($passwordBD); //el var_dump aquí no me mostró nada al intentar iniciar sesión return false; }

        Realmente no entiendo de dónde me sale el sha1...

        0
  3. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
     

    ¿Cómo llamas a tus funciones?

    ¿No sería eso AJAX?

    Una vez más ... si solo nos das fragmentos de código y no los archivos completos ... no podemos saber cuál es el flujo del código ...


    .
    Cordialmente,
    Jordane

    0
    1. llaumegui
       

      No, no es Ajax, es PHP puro y duro

      En mi proyecto llamo a las funciones desde los Controladores:

      <?php require_once "models/UserManager.class.php"; class UserController { public $userManager; public function __construct() { $this->userManager = new UserManager; $this->userManager->chargementUsers(); } public function afficherUsers() { $users = $this->userManager->getUser(); require "views/user/users.view.php"; } public function modificationUser($id) { $user = $this->userManager->getUserById($id); require "views/user/updateUser.view.php"; } public function ajoutUser() { require "views/user/createUser.view.php"; } public function motDePasseOublie() { require "views/motDePasseOublie.view.php"; } public function ajoutuserValidation() { if ($_POST['bl'] != 'on') { $_POST['bl'] = 0; } else { $_POST['bl'] = 1; } if ($_POST['dist'] != 'on') { $_POST['dist'] = 0; } else { $_POST['dist'] = 1; } if ($_POST['admin'] != 'on') { $_POST['admin'] = 0; } else { $_POST['admin'] = 1; } if ($_POST['demandevalidation'] != 'on') { $_POST['demandevalidation'] = 0; } else { $_POST['demandevalidation'] = 1; } if ($_POST['pilote'] != 'on') { $_POST['pilote'] = 0; } else { $_POST['pilote'] = 1; } if ($_POST['rs'] != 'on') { $_POST['rs'] = 0; } else { $_POST['rs'] = 1; } if ($_POST['password'] === $_POST['passwordverif']) { $this->userManager->ajoutUserBd( $_POST['login'], $_POST['password'], $_POST['mail'], $_POST['admin'], $_POST['bl'], $_POST['dist'], $_POST['NomPrenom'], $_POST['demandevalidation'], $_POST['pilote'], $_POST['rs'] ); header('Location: ' . URL . "users"); } else { Toolbox::ajouterMessageAlerte("Las contraseñas no son las mismas", Toolbox::COULEUR_ROUGE); } } public function modificationUserValidation() { if ($_POST['bl'] != 'on') { $_POST['bl'] = 0; } else { $_POST['bl'] = 1; } if ($_POST['dist'] != 'on') { $_POST['dist'] = 0; } else { $_POST['dist'] = 1; } if ($_POST['admin'] != 'on') { $_POST['admin'] = 0; } else { $_POST['admin'] = 1; } if ($_POST['demandevalidation'] != 'on') { $_POST['demandevalidation'] = 0; } else { $_POST['demandevalidation'] = 1; } if ($_POST['pilote'] != 'on') { $_POST['pilote'] = 0; } else { $_POST['pilote'] = 1; } if ($_POST['rs'] != 'on') { $_POST['rs'] = 0; } else { $_POST['rs'] = 1; } $this->userManager->modificationUserBd( $_POST['id'], $_POST['login'], $_POST['mail'], $_POST['admin'], $_POST['bl'], $_POST['dist'], $_POST['NomPrenom'], $_POST['demandevalidation'], $_POST['pilote'], $_POST['rs'] ); Toolbox::ajouterMessageAlerte("La modificación se ha realizado con éxito", Toolbox::COULEUR_VERTE); header('Location: ' . URL . "users"); } public function motDePasseReinit() { if ((!empty($_POST['login'])) && (!empty($_POST['mail']))) { $this->userManager->motDePasseReinitValid( $_POST['login'], $_POST['mail'] ); } else { Toolbox::ajouterMessageAlerte("Combinación Login / Mail no válida", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/motdepasse"); } } public function motDePasseReinitValid($key) { $this->userManager->motDePasseReinitValidation($key); } public function login() { require "views/login.view.php"; } public function validation_login($login, $password) { if ($this->userManager->isCombinaisonValide($login, $password)) { Toolbox::ajouterMessageAlerte("¡Bienvenido de nuevo al portal " . $login . "! AÑADIR EL SISTEMA DE FILTRO PARA LOS INCIDENTES" , Toolbox::COULEUR_VERTE); $_SESSION['profil'] = [ "login" => $login, ]; $datas = $this->userManager->getUserInformation($_SESSION['profil']['login']); $_SESSION['profil']["bl"] = $datas['bl']; $_SESSION['profil']["dist"] = $datas['dist']; $_SESSION['profil']["admin"] = $datas['admin']; $_SESSION['profil']["demandevalidation"] = $datas['demandevalidation']; $_SESSION['profil']["pilote"] = $datas['pilote']; $_SESSION['profil']["rs"] = $datas['rs']; if (Securite::estConnecte() && Securite::estBl()) { header("Location: " . URL . "tngs"); } else { header("Location: " . URL . "accueil"); } } else { Toolbox::ajouterMessageAlerte("Combinación Login / Contraseña no válida", Toolbox::COULEUR_ROUGE); header("location: " . URL); } } public function profil() { $datas = $this->userManager->getUserInformation($_SESSION['profil']['login']); $_SESSION['profil']["bl"] = $datas['bl']; $_SESSION['profil']["dist"] = $datas['dist']; $_SESSION['profil']["admin"] = $datas['admin']; $_SESSION['profil']["demandevalidation"] = $datas['demandevalidation']; $_SESSION['profil']["pilote"] = $datas['pilote']; $_SESSION['profil']["rs"] = $datas['rs']; } public function deconnexion() { $domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false; Toolbox::ajouterMessageAlerte("La desconexión se ha realizado", Toolbox::COULEUR_VERTE); unset($_SESSION['profil']); setcookie(Securite::COOKIE_NAME,"",time() - 3600, '/', $domain, false, true); header("Location: " . URL); } public function deleteUser($id) { $this->userManager->deleteUserBd($id); header('Location: ' . URL . "users"); } } 

      En este Controlador llamo a las funciones de reinicio de contraseña

      Además, no sé realmente para qué sirven estas líneas. (recuerdo que retomo el proyecto de alguien sin ninguna documentación):

      public function motDePasseReinitValid($key) { $this->userManager->motDePasseReinitValidation($key); }

      PD: la aplicación es bastante considerable, así que no serviría de mucho mostrar todo el código, además, es un proyecto empresarial, así que debo tener cuidado con lo que envío.

      0
    2. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831 > llaumegui
       

      ok.

      Sin embargo, no ves tus echo y tus var_dump porque hay que desactivar todas las redirecciones

       header('Location: ...
      0
    3. llaumegui > jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención  
       

      Re, he vuelto a hacer una prueba (spoil: mismo problema, me lo vuelve a poner la contraseña en sha1)

      He añadido var_dump() y quitado los header(), las 2 funciones motDePasseReinitValid() y motDePasseReinitValidation() así:

      public function motDePasseReinitValid($login, $mail) { $req = "SELECT id, mail, password FROM user WHERE login = '$login' AND mail = '$mail'"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat == false) { Toolbox::ajouterMessageAlerte("Combinación Login / Mail no válida", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); var_dump($resultat); } else { $char = '1234567890abcdefghijklmnopqrstuvwxyz0123456789'; $key = str_shuffle($char); $longueur = '8'; $possible = '123456789abcdfghjkmnpqrtvwxyzABCDFGHJKLMNPQRTVWXYZ'; $mdp = ''; // este valor será usado más tarde $longueurMax = strlen($possible); if ($longueur > $longueurMax) { $longueur = $longueurMax; } $i = 0; while ($i < $longueur) { // toma un carácter aleatorio $caractere = substr($possible, mt_rand(0, $longueurMax - 1), 1); $mdp .= $caractere; $i++; } $req = "INSERT INTO reinit_passwd(id_user, key_gen, new_passwd) VALUES(:id_user, :key_gen, :new_passwd)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $resultat['id'], PDO::PARAM_STR); $stmt->bindValue(":key_gen", $key, PDO::PARAM_STR); $stmt->bindValue(":new_passwd", $mdp, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); var_dump($resultat); //=====Declaración de mensajes en formato texto y en formato HTML. $passage_ligne = "\r\n"; $message_txt = "Hola, has hecho una solicitud para una nueva contraseña para el portal."; $message_html = "<html><head></head><body>Hola,<br /><br /> Has hecho una solicitud para una nueva contraseña para <b>el portal</b>.<br /><br />Para confirmar la reinitialización de la contraseña, por favor, haz clic en el siguiente enlace: <br /><br /><a href=\"http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "\">http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "<a/></body></html>"; //========== //=====Creación del boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Definición del asunto. $sujet = "portal - Contraseña olvidada" . chr(233); //========= //=====Creación del header del correo. $header = "From: \"portal\"<***@***>" . $passage_ligne; $header .= "Reply-to: \"portal \" <***@***>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Creación del mensaje. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Añadir el mensaje en formato texto. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Añadir el mensaje en formato HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====Se cierra el boundary alternativo. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== if (mail($mail, $sujet, $message, $header)) { Toolbox::ajouterMessageAlerte("Un correo para la reinitialización de la contraseña ha sido enviado", Toolbox::COULEUR_VERTE); //header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Error al enviar el correo. Intenta nuevamente. Si el problema persiste, contacta a la célula SI", Toolbox::COULEUR_ROUGE); } } } //Función para validar la reinitialización de la contraseña public function motDePasseReinitValidation($key) { $req = "SELECT id, id_user, new_passwd FROM reinit_passwd WHERE key_gen = '$key'"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat > 0) { $idtempo = $resultat['id_user']; $motdepassetemp = $resultat['new_passwd']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp); $req = "SELECT mail FROM user WHERE id = $idtempo"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); $mailtest = $resultatmail['mail']; $req = "UPDATE user SET password = :password WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); var_dump($motdepassehash); $req = " DELETE FROM reinit_passwd WHERE id_user = $idtempo "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $idtempo, PDO::PARAM_INT); $resultatdelete = $stmt->execute(); $stmt->closeCursor(); //=====Declaración de mensajes en formato texto y en formato HTML. $passage_ligne = "\r\n"; $message_txt = "Hola, has reinitializado tu contraseña para el portal."; $message_html = "<html><head></head><body>Hola,<br /><br /> Has reinitializado tu contraseña.<br /><br /> Nueva contraseña : " . $motdepassetemp . "<a/></body></html>"; //========== //=====Creación del boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Definición del asunto. $sujet = "portal - Nueva contraseña"; //========= //=====Creación del header del correo. $header = "From: \"portal\"<***@***>" . $passage_ligne; $header .= "Reply-to: \"portal\"<***@***>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Creación del mensaje. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Añadir el mensaje en formato texto. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Añadir el mensaje en formato HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====Se cierra el boundary alternativo. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== //=====Envío del correo. if (mail($mailtest, $sujet, $message, $header) && ($resultatdelete != false) && ($resultat != false) && ($resultatmail != false)) { Toolbox::ajouterMessageAlerte("Tu contraseña ha sido reinitializada correctamente", Toolbox::COULEUR_VERTE); //header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Error durante la reinitialización de la contraseña - Código de error: #UM01", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); } } else { Toolbox::ajouterMessageAlerte("El enlace no ha sido validado por nuestro sitio. Por favor intenta de nuevo. Código de error: #UM02", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); } }

      Y por lo tanto he reinitializado la contraseña y todavía tuve un error cuando envié el formulario de reinitialización de la contraseña (el formulario: id y mail del usuario):

      la línea 309 en la función motDePasseReinitValid($login, $mail):

       $resultat = $stmt->fetch(PDO::FETCH_ASSOC);

      un error en la variable que estoy haciendo dump

      Pero a pesar de este error, recibo el correo de reinitialización, hago clic en el enlace de reinitialización que me abre dos páginas:

      La primera:

      Una página de reinitialización de la contraseña (la que ingreso mi id y mi correo para solicitar la reinitialización de la contraseña) con este error:

      La segunda:

      me vuelve a la página de inicio de sesión con el mensaje que confirma la reinitialización. Lo cual es cierto, ya que recibo el segundo correo con la nueva contraseña.

      Entonces, para terminar, intento conectarme con la nueva contraseña pero no funciona porque uso password_verify() (para probar si la contraseña corresponde a lo que el usuario ingresa) mientras que está hashada en sha1 en la actualización de la tabla de usuario...

      0
    4. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831 > llaumegui
       

      Tienes un error aquí:

      $req = "SELECT id, mail, password FROM user WHERE login = '$login' AND mail = '$mail'"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor();

      A corregir por

      $req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail ", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor();
      0
    5. llaumegui > jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención  
       

      He modificado como me dijiste, lo que dices me parece lógico a mí también, no había prestado atención, pero tengo un error.

      He modificado bien lo que me dijiste: 

       $req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail ", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor();

      Al enviar el formulario, aparece este error: 

      la línea 274 (en la función motDePasseReinitValid($login, $mail)) : 

       $stmt->execute();

      Y por lo tanto, no tengo un correo para la re-inicialización y por lo tanto tampoco un UPDATE en mi tabla.

      0
  4. llaumegui
     

    Sí, perdón, seguro que parece evidente con el código frente a los ojos^^

     public function motDePasseReinitValid($login, $mail) { $req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail ", $mail , PDO::PARAM_STR); $stmt->execute(); //línea 274 $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor();
    0
    1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
       

      Hay espacios de más en el bind del correo

      0
  5. llaumegui
     

    Bien visto para los espacios, he modificado así:

    $req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor();

    Luego, al enviar el formulario de reinicio, tengo este error:

    la línea 310:

     $req = "INSERT INTO reinit_passwd(id_user, key_gen, new_passwd) VALUES(:id_user, :key_gen, :new_password)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $resultat['id'], PDO::PARAM_STR); $stmt->bindValue(":key_gen", $key, PDO::PARAM_STR); $stmt->bindValue(":new_password", $mdp, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); //la línea 310 $stmt->closeCursor(); var_dump($resultat);

    Y aquí recibo el correo para la reiniciación de la contraseña, sin errores

    Luego, el segundo correo con la nueva contraseña y por lo tanto el mismo problema, se actualiza en sha1 en mi tabla de usuarios.

    0
    1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
       

      No puedes hacer un fetch en algo que no sea una consulta de tipo SELECT.

      Sin embargo... lo has puesto en un insert...

      0
    2. llaumegui > jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención  
       

      Entonces, si he entendido bien esta línea:

      $resultat = $stmt->fetch(PDO::FETCH_ASSOC); //línea 310

      es incorrecta, además no sirve para nada, así que puedo eliminarla, ¿verdad?

      0
    3. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831 > llaumegui
       

      0
    4. llaumegui > jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención  
       

      Está bien, hice de nuevo una prueba eliminando esta línea, ¡ya no tengo errores!

      ¡Finalmente podemos ver mi var_dump()!

      Entonces, después de enviar el formulario de restablecimiento, me muestra mi variable $resultat que vuelco aquí:

      /Función para restablecer su contraseña public function motDePasseReinitValid($login, $mail) { $req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat == false) { Toolbox::ajouterMessageAlerte("Combinación Login / Mail no válida", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); var_dump($resultat); //el volcado de la captura de pantalla de arriba

      Como se puede ver, es efectivamente la contraseña hash con password_hash() que recupero.

      0
    5. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831 > llaumegui
       

      Entonces está bien...

      0
  6. llaumegui
     

    En mi primer mensaje:

    Siempre he dicho que el problema es la ACTUALIZACIÓN de la tabla de usuario con la nueva contraseña. Además, en cada mensaje insisto en repetir que el problema es que me lo inserta en sha1 en la actualización (puedes verificarlo).

    Entonces, el problema es por qué me lo inserta en sha1 en la actualización de mi tabla de usuario?

    0
    1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
       

      Haz un var_dump de la variable $motdepassehash antes de la actualización

      y vuelve a hacer un var_dump de $resultat después de la actualización

       $motdepastemp = $resultat['new_passwd']; $motdepassehash = password_hash($motdepastemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepastemp); //$motdepassehash = sha1($motdepastemp); echo "<br> MDP proveniente de la bdd : " . $motdepastemp; echo "<br> MDP hash : " . $motdepassehash; // contraseña hasheada correctamente ? /* visiblemente.. este código no sirve aquí .. mejor muévelo a donde sirve ! $req = "SELECT mail FROM user WHERE id = $idtempo"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); $mailtest = $resultatmail['mail']; */ try{ $req = "UPDATE user SET password = :password WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); var_dump($resultat); // debería mostrar true o false .. true si se actualizó ! }catch(Exception $e){ echo "Error : " . $e->getMessage(); exit; }
      0
      1. llaumegui > jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención  
         

        He copiado tu código así:

        //Función para validar la reinitialización de la contraseña public function motDePasseReinitValidation($key) { $req = "SELECT id, id_user, new_password FROM reinit_passwd WHERE key_gen = '$key'"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat > 0) { $idtempo = $resultat['id_user']; $motdepassetemp = $resultat['new_password']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp); echo "<br> MDP venido de la bdd : " . $motdepassetemp; echo "<br> MDP hash : " . $motdepassehash; // contraseña hasheada correctamente ? /* visiblemente.. este código no sirve de nada aquí.. mejor moverlo a donde sirve ! $req = "SELECT mail FROM user WHERE id = $idtempo"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); $mailtest = $resultatmail['mail']; */ try{ $req = "UPDATE user SET password = :password WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); var_dump($resultat); // debería mostrar true o false .. true si se actualizó ! }catch(Exception $e){ echo "Error : " . $e->getMessage(); exit; } // $req = "SELECT mail FROM tng_user WHERE id = $idtempo"; // $stmt = $this->getBdd()->prepare($req); // $stmt->execute(); // $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); // $stmt->closeCursor(); // $mailtest = $resultatmail['mail']; // $req = "UPDATE user // SET password = :password // WHERE id = :id"; // $stmt = $this->getBdd()->prepare($req); // $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); // $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); // $resultat = $stmt->execute(); // $stmt->closeCursor(); // var_dump($motdepassehash); 

        Lo que es extraño es que he quitado lo que dijiste que no servía aquí y no ha dado error.

        Solo he visto mostrar el mismo var_dump() que hace un momento después de enviar el formulario de reinitialización.

        He recibido los 2 correos siempre y un UPDATE de la contraseña en sha1 en mi tabla user.

        Creo que no podré responderte antes del lunes porque no tengo mi equipo de trabajo en casa, pero el lunes podemos retomar, por favor no dudes en responder ahora o tan pronto como veas este mensaje, ¡te responderé el lunes! ¡gracias de nuevo por la ayuda! ;)

        0
      2. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831 > llaumegui
         

        ¿Ves los echo que he puesto?

        Si no los ves... es que no pasas por esta función...

        Si los ves... ¿puedes pegarnos lo que te muestran y confirmarnos que la codificación es correcta?

        0
      3. llaumegui > jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención  
         

        Re,

        He hecho una nueva prueba esta mañana con el mismo código que en mi último mensaje.

        Entonces envío el formulario de reinicio, tengo mi var_dump que se muestra:

        Recibo el primer correo que me lleva a un mensaje de error y no recibo, por tanto, el segundo correo con la nueva contraseña.

        Es un mensaje de error en la gestión de mis rutas en mi index.php.

        En cuanto a los echo no los veo, pero sigue siendo extraño porque la actualización se realizaba bien en la tabla, aunque no era la correcta.

        0
      4. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831 > llaumegui
         

        No es posible que no veas los echo... a menos que hayas olvidado quitar una redirección...

        En última instancia, coloca un exit después de los echo.

        Si aún no los ves... es que no estás pasando por esta función!

        0
  7. llaumegui
     

    He vuelto a hacer la prueba con un exit en este punto:

    if ($resultat > 0) { $idtempo = $resultat['id_user']; $motdepassetemp = $resultat['new_password']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp); echo "<br> MDP viniendo de la bdd: " . $motdepassetemp; echo "<br> MDP hash: " . $motdepassehash; // contraseña hash correctamente? exit; 

    Ningun cambio, no he visto ningún echo (mismo resultado que la prueba anterior).

    Me preguntaba si quizás eso podría causar problemas, en mi controlador donde llamo a estas funciones instancio una función que tiene el mismo nombre que otra en mi gestor de usuarios:

    Mi controlador:

     public function motDePasseReinitValid($key) { $this->userManager->motDePasseReinitValidation($key); }

    Mi gestor de usuarios:

     public function motDePasseReinitValid($login, $mail) { $req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat == false) { Toolbox::ajouterMessageAlerte("Combinación Login / Mail no válida", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); var_dump($resultat); } else { $char = '1234567890abcdefghijklmnopqrstuvwxyz0123456789'; $key = str_shuffle($char); $longueur = '8'; $possible = '123456789abcdfghjkmnpqrtvwxyzABCDFGHJKLMNPQRTVWXYZ'; $mdp = ''; // este valor se usará más tarde $longueurMax = strlen($possible); if ($longueur > $longueurMax) { $longueur = $longueurMax; } $i = 0; while ($i < $longueur) { // toma un carácter aleatorio $caractere = substr($possible, mt_rand(0, $longueurMax - 1), 1); $mdp .= $caractere; $i++; } $req = "INSERT INTO reinit_passwd(id_user, key_gen, new_password) VALUES(:id_user, :key_gen, :new_password)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $resultat['id'], PDO::PARAM_STR); $stmt->bindValue(":key_gen", $key, PDO::PARAM_STR); $stmt->bindValue(":new_password", $mdp, PDO::PARAM_STR); $stmt->execute(); $stmt->closeCursor(); var_dump($resultat); //=====Declaración de mensajes en formato texto y en formato HTML. $passage_ligne = "\r\n"; $message_txt = "Hola, has solicitado un nuevo password para el Portal."; $message_html = "<html><head></head><body>Hola,<br /><br /> Has solicitado un nuevo password para <b>el Portal</b>.<br /><br />Para confirmar la reactivación del password, por favor haz clic en el siguiente enlace: <br /><br /><a href=\"http://dns.fr/portail_/users/motdepassereinitvalid/" . $key . "\">http://dns.fr/portail_/users/motdepassereinitvalid/" . $key . "<a/></body></html>"; //========== //=====Creación de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Definición del asunto. $sujet = "Portal - Password olvidado". chr(233); //========= //=====Creación del header del e-mail. $header = "From: \"Portal Bl\"<mail.xxx.com>" . $passage_ligne; $header .= "Reply-to: \"Portal \" <mail.xxx.com>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Creación del mensaje. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Añadir el mensaje en formato texto. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Añadir el mensaje en formato HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====Cerramos la boundary alternativa. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== if (mail($mail, $sujet, $message, $header)) { Toolbox::ajouterMessageAlerte("Un correo para la reactivación del password ha sido enviado", Toolbox::COULEUR_VERTE); //header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Error al enviar el correo. Inténtalo de nuevo. Si el problema persiste, contacta con el servicio de IT", Toolbox::COULEUR_ROUGE); } } } 

    No sé si eso puede tener un impacto ya que no tienen los mismos parámetros, además no es esta función la que realiza la actualización de mi tabla de usuarios.

    0
    1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
       

      Entonces... una vez más... solo con pequeños trozos de código... es imposible tener una visión lo suficientemente completa de cómo funciona tu código...

      Deberías pegarnos la integridad de tus archivos, indicando, para cada uno de ellos, su nombre!

      Pero insisto... si no ves los ecos... es porque no estás entrando en esa función. Así que es normal que no se actualice como quieres!

      0
      1. llaumegui > jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención  
         
        ```html

        Está bien

        aquí está la integridad de mi página userManager.class.php :

        <?php usar LDAP\Result; require_once 'Model.class.php'; require_once 'User.class.php'; clase UserManager extiende Model { privado $user; //Tabla de vdc public function ajoutUser($user) { $this->users[] = $user; } public function getUser() { return $this->users; } // Función que carga todos los usuarios de la bdd. public function chargementUsers() { $req = $this->getBdd()->prepare( 'SELECT id, login,password, mail, admin, bl, dist, NomPrenom, demandevalidation , pilote, rs FROM user' ); $req->execute(); $donnees = $req->fetchAll(PDO::FETCH_ASSOC); $req->closeCursor(); // Código de error: #UM01 if (!empty($donnees)) { foreach ($donnees as $donnees_users) { $q = new User( $donnees_users['id'], $donnees_users['login'], $donnees_users['password'], $donnees_users['mail'], $donnees_users['admin'], $donnees_users['bl'], $donnees_users['dist'], $donnees_users['NomPrenom'], $donnees_users['demandevalidation'], $donnees_users['pilote'], $donnees_users['rs'] ); $this->ajoutUser($q); } } else { Toolbox::ajouterMessageAlerte("Fallo al cargar los usuarios - Código de error: #UM01", Toolbox::COULEUR_ROUGE); header('Location: ' . URL); } } // Función para un usuario en función de su id public function getUserById($id) { for ($i = 0; $i < count($this->users); $i++) { if ($this->users[$i]->getId() === $id) { return $this->users[$i]; } } } // Función para buscar la contraseña de un usuario en función de su CUID private function getPasswordUser($login) { $req = "SELECT password FROM user WHERE login = :login"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); // Código de error: #UM03 if ($resultat != false) { return $resultat['password']; } else { //descomentar durante el paso en producción y comentar la línea de abajo Toolbox::ajouterMessageAlerte("Fallo en la consulta", Toolbox::COULEUR_ROUGE); Toolbox::ajouterMessageAlerte("Fallo en la consulta - Código de error: #UM03", Toolbox::COULEUR_ROUGE); header("location: " . URL); } } // Función que compara la contraseña de la bdd y la ingresada por el usuario public function isCombinaisonValide($login, $password) { //$password = hash('sha256',$password); //$password = sha1($password); $passwordBD = $this->getPasswordUser($login); // Código de error: #UM04 if (password_verify($password, $passwordBD)) { return true; } else { // descomentar durante el paso en producción y comentar la línea de abajo Toolbox::ajouterMessageAlerte("Fallo al iniciar sesión", Toolbox::COULEUR_ROUGE); Toolbox::ajouterMessageAlerte("Fallo en la comparación - Código de error: #UM04", Toolbox::COULEUR_ROUGE); return false; } } // Función que añade un usuario a la bdd public function ajoutUserBd( $login, $password, $mail, $admin, $bl, $dist, $NomPrenom, $demandevalidation, $pilote, $rs ) { $login = strip_tags($login); $password = strip_tags($password); $mail = strip_tags($mail); $admin = strip_tags($admin); $bl = strip_tags($bl); $dist = strip_tags($dist); $NomPrenom = strip_tags($NomPrenom); $demandevalidation = strip_tags($demandevalidation); $pilote = strip_tags($pilote); $rs = strip_tags($rs); $hashed_password = password_hash($password, PASSWORD_DEFAULT); //$password = hash('sha256',$password); //$password = sha1($password); $req = "INSERT INTO user(login, password, mail, admin, bl, dist, NomPrenom, demandevalidation, pilote, rs) VALUES(:login, :password, :mail, :admin, :bl, :dist, :NomPrenom, :demandevalidation, :pilote, :rs)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":password", $hashed_password, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail, PDO::PARAM_STR); $stmt->bindValue(":admin", $admin); $stmt->bindValue(":bl", $bl); $stmt->bindValue(":dist", $dist, PDO::PARAM_STR); $stmt->bindValue(":NomPrenom", $NomPrenom, PDO::PARAM_STR); $stmt->bindValue(":demandevalidation", $demandevalidation, PDO::PARAM_STR); $stmt->bindValue(":pilote", $pilote, PDO::PARAM_STR); $stmt->bindValue(":rs", $rs, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); // Código de error: #UM05 if ($resultat > 0) { $user = new User( $this->getBdd()->lastInsertId(), $login, $password, $mail, $admin, $bl, $dist, $NomPrenom, $demandevalidation, $pilote, $rs ); $this->ajoutUser($user); Toolbox::ajouterMessageAlerte("Añadido el usuario exitosamente", Toolbox::COULEUR_VERTE); } else { Toolbox::ajouterMessageAlerte("Fallo al añadir un usuario - Código de error: #UM05", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users"); } } // Función para modificar un usuario public function modificationUserBd( $id, $login, $mail, $admin, $bl, $dist, $NomPrenom, $demandevalidation, $pilote, $rs ) { $login = strip_tags($login); $mail = strip_tags($mail); $admin = strip_tags($admin); $bl = strip_tags($bl); $dist = strip_tags($dist); $NomPrenom = strip_tags($NomPrenom); $demandevalidation = strip_tags($demandevalidation); $pilote = strip_tags($pilote); $rs = strip_tags($rs); $req = "UPDATE user set login = :login, mail = :mail, admin = :admin, bl = :bl, dist = :dist, NomPrenom = :NomPrenom, demandevalidation = :demandevalidation, pilote = :pilote, rs = :rs WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $id, PDO::PARAM_INT); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail, PDO::PARAM_STR); $stmt->bindValue(":admin", $admin, PDO::PARAM_STR); $stmt->bindValue(":bl", $bl); $stmt->bindValue(":dist", $dist); $stmt->bindValue(":NomPrenom", $NomPrenom, PDO::PARAM_STR); $stmt->bindValue(":demandevalidation", $demandevalidation); $stmt->bindValue(":pilote", $pilote); $stmt->bindValue(":rs", $rs); $resultat = $stmt->execute(); $stmt->closeCursor(); if ($resultat > 0) { $this->getUserById($id)->setLogin($login); $this->getUserById($id)->setMail($mail); $this->getUserById($id)->setAdmin($admin); $this->getUserById($id)->setBl($bl); $this->getUserById($id)->setDist($dist); $this->getUserById($id)->setNomPrenom($NomPrenom); $this->getUserById($id)->setDemandeValidation($demandevalidation); $this->getUserById($id)->setPilote($pilote); $this->getUserById($id)->setRs($rs); } } public function getUserInformation($login) { $req = "SELECT * FROM user WHERE login = :login"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); return $resultat; } public function deleteUserBd($id) { $req = " DELETE from `user` where `id` = " . $id . " "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $id, PDO::PARAM_INT); $stmt->execute(); $stmt->closeCursor(); Toolbox::ajouterMessageAlerte("La eliminación ha sido realizada", Toolbox::COULEUR_VERTE); } //Función para reiniciar su contraseña public function motDePasseReinitValid($login, $mail) { $req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat == false) { Toolbox::ajouterMessageAlerte("Combinación Login / Mail no válida", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); var_dump($resultat); } else { $char = '1234567890abcdefghijklmnopqrstuvwxyz0123456789'; $key = str_shuffle($char); $longueur = '8'; //No funciona si se pone a 12 $possible = '123456789abcdfghjkmnpqrtvwxyzABCDFGHJKLMNPQRTVWXYZ'; $mdp = ''; // este valor será utilizado más tarde $longueurMax = strlen($possible); if ($longueur > $longueurMax) { $longueur = $longueurMax; } $i = 0; while ($i < $longueur) { // toma un carácter aleatorio $caractere = substr($possible, mt_rand(0, $longueurMax - 1), 1); $mdp .= $caractere; $i++; } $req = "INSERT INTO reinit_passwd(id_user, key_gen, new_password) VALUES(:id_user, :key_gen, :new_password)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $resultat['id'], PDO::PARAM_STR); $stmt->bindValue(":key_gen", $key, PDO::PARAM_STR); $stmt->bindValue(":new_password", $mdp, PDO::PARAM_STR); $stmt->execute(); $stmt->closeCursor(); var_dump($resultat); //=====Declaración de mensajes en formato de texto y en formato HTML. $passage_ligne = "\r\n"; $message_txt = "Hola, has hecho una solicitud de nueva contraseña para el Portal."; $message_html = "<html><head></head><body>Hola,<br /><br /> Has hecho una solicitud de nueva contraseña para <b>el Portal</b>.<br /><br />Para confirmar la reinicialización de la contraseña, por favor haz clic en el siguiente enlace: <br /><br /><a href=\"http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "\">http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "<a/></body></html>"; //========== //=====Creación de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Definición del asunto. $sujet = "Portal - Contraseña olvidada". chr(233); //========= //=====Creación del encabezado del e-mail. $header = "From: \"Portal\"<mail.xxx.com>" . $passage_ligne; $header .= "Reply-to: \"Portal \" <mail.xxx.com>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Creación del mensaje. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Adición del mensaje en formato texto. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Adición del mensaje en formato HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====Cerramos el boundary alternativo. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== if (mail($mail, $sujet, $message, $header)) { Toolbox::ajouterMessageAlerte("Un correo para la reinicialización de la contraseña ha sido enviado", Toolbox::COULEUR_VERTE); //header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Fallo al enviar el correo. Intenta de nuevo. Si el problema persiste, contacta al equipo de SI", Toolbox::COULEUR_ROUGE); } } } //Función para validar la reinicialización de la contraseña public function motDePasseReinitValidation($key) { $req = "SELECT id, id_user, new_password FROM reinit_passwd WHERE key_gen = '$key'"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat > 0) { $idtempo = $resultat['id_user']; $motdepassetemp = $resultat['new_password']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp); echo "<br> MDP que viene de la bdd : " . $motdepassetemp; echo "<br> MDP hash : " . $motdepassehash; // contraseña hasheada correctamente ? exit; /* aparentemente.. este código no sirve aquí.. mejor moverlo a donde sirve! $req = "SELECT mail FROM user WHERE id = $idtempo"; $stmt = $this->getBdd()->prepare($req); $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); $mailtest = $resultatmail['mail']; */ try{ $req = "UPDATE user SET password = :password WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); var_dump($resultat); // debería mostrar true o false .. true si se actualiza! }catch(Exception $e){ echo "Error : " . $e->getMessage(); exit; } // $req = "SELECT mail FROM user WHERE id = $idtempo"; // $stmt = $this->getBdd()->prepare($req); // $stmt->execute(); // $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); // $stmt->closeCursor(); // $mailtest = $resultatmail['mail']; // $req = "UPDATE user // SET password = :password // WHERE id = :id"; // $stmt = $this->getBdd()->prepare($req); // $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); // $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); // $resultat = $stmt->execute(); // $stmt->closeCursor(); // var_dump($motdepassehash); $req = " DELETE FROM reinit_passwd WHERE id_user = $idtempo "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $idtempo, PDO::PARAM_INT); $resultatdelete = $stmt->execute(); $stmt->closeCursor(); //=====Declaración de mensajes en formato texto y en formato HTML. $passage_ligne = "\r\n"; $message_txt = "Hola, has reiniciado tu contraseña para el Portal."; $message_html = "<html><head></head><body>Hola,<br /><br /> Has reiniciado tu contraseña.<br /><br /> Nueva contraseña : " . $motdepassetemp . "<a/></body></html>"; //========== //=====Creación de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Definición del asunto. $sujet = "Portal - Nueva contraseña"; //========= //=====Creación del encabezado del e-mail. $header = "From: \"Portal\"<mail.xxx.com>" . $passage_ligne; $header .= "Reply-to: \"Portal\"<mail.xxx.com>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Creación del mensaje. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Adición del mensaje en formato texto. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Adición del mensaje en formato HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====Cerramos el boundary alternativo. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== //=====Envío del e-mail. if (mail($mailtest, $sujet, $message, $header) && ($resultatdelete != false) && ($resultat != false) && ($resultatmail != false)) { Toolbox::ajouterMessageAlerte("Tu contraseña ha sido reiniciada correctamente", Toolbox::COULEUR_VERTE); //header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Fallo en la reinicialización de la contraseña - Código de error : #UM01", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); } } else { Toolbox::ajouterMessageAlerte("El enlace no ha sido aprobado por nuestro sitio. Por favor intenta de nuevo. Código de error : #UM02", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); } } } 

        Mi página userController.php : 

         <?php require_once "models/UserManager.class.php"; class UserController { public $userManager; public function __construct() { $this->userManager = new UserManager; $this->userManager->chargementUsers(); } public function afficherUsers() { $users = $this->userManager->getUser(); require "views/user/users.view.php"; } public function modificationUser($id) { $user = $this->userManager->getUserById($id); require "views/user/updateUser.view.php"; } public function ajoutUser() { require "views/user/createUser.view.php"; } public function motDePasseOublie() { require "views/motDePasseOublie.view.php"; } public function ajoutuserValidation() { if ($_POST['bl'] != 'on') { $_POST['bl'] = 0; } else { $_POST['bl'] = 1; } if ($_POST['dist'] != 'on') { $_POST['dist'] = 0; } else { $_POST['dist'] = 1; } if ($_POST['admin'] != 'on') { $_POST['admin'] = 0; } else { $_POST['admin'] = 1; } if ($_POST['demandevalidation'] != 'on') { $_POST['demandevalidation'] = 0; } else { $_POST['demandevalidation'] = 1; } if ($_POST['pilote'] != 'on') { $_POST['pilote'] = 0; } else { $_POST['pilote']
            
        0