Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: oscarcaronte en 1 Mayo 2020, 18:01 pm



Título: Hash y control de usuario
Publicado por: oscarcaronte en 1 Mayo 2020, 18:01 pm
Hola,

Hace mucho tiempo que no programaba (y estoy recuperando códigos hechos con mysql, que debo pasar a mysqli.

También veo que la cifrado md5 ya no es la más segura y estoy intentando pasar a un hash diferente.

La cuestión es en el archivo que yo llamaba validar.php


Utilizaba la expresión   
Código
  1. $pw_enc = md5($pw);
 

Y ahora quisiera en ese código utilizar

Código
  1. $pw_enc =password_hash($pw, PASSWORD_DEFAULT, array("cost"=>12));
  2.  


Pero tal y como está parece que ya no valdría el código (sé que hay que transformarlo a mysqli pero me refiero a que por lo que leo habría que añadir en algún punto un password_verify para que cotejara que son el mismo, ¿cómo podría hacerse esto? ¿es necesario el password verify? Y si es así, me podríais ayudar a saber dónde?


validar.php


Código
  1. <?php
  2.  
  3.  
  4.    //conectar BD
  5.    include("conectar_bd.php");  
  6.    conectar_bd();
  7.  
  8.    $usr = $_POST['usuario'];
  9.    $pw = $_POST['password'];
  10.    //Obtengo la version cifrada del password
  11.    $pw_enc = md5($pw);
  12.  
  13.  
  14.  
  15.  
  16.    $result=$conexio->query("SELECT id_usuario FROM tbl_users
  17.            INNER JOIN ctg_tiposusuario
  18.            ON tbl_users.id_TipoUsuario = ctg_tiposusuario.id_TipoUsuario
  19.            WHERE tx_username = '".$usr."'
  20.            AND tx_password = '".$pw_enc."' ");
  21.  
  22.    $uid = "";
  23.  
  24.    //Si existe al menos una fila
  25.    if( $fila=$result->fetch_array(MYSQLI_ASSOC))
  26.    {      
  27.        //Obtener el Id del usuario en la BD        
  28.        $uid = $fila['id_usuario'];
  29.        //Iniciar una sesion de PHP
  30.        session_start();
  31.        //Crear una variable para indicar que se ha autenticado
  32.        $_SESSION['autenticado'] = 'SI';
  33.        //Crear una variable para guardar el ID del usuario para tenerlo siempre disponible
  34.        $_SESSION['uid'] = $uid;
  35.        //CODIGO DE SESION
  36.  
  37.        //Crear un formulario para redireccionar al usuario y enviar oculto su Id
  38. ?>
  39.        <form name="formulario" method="post" action="principalcero.php">
  40.            <input type="hidden" name="idUsr" value='<?php echo $uid ?>' />
  41.        </form>
  42. <?php
  43.    }
  44.    else {
  45.        //En caso de que no exista una fila...
  46.        //..Crear un formulario para redireccionar al usuario a la pagina de login
  47.        //enviandole un codigo de error
  48. ?>
  49.        <form name="formulario" method="post" action="index.php">
  50.            <input type="hidden" name="msg_error" value="1">
  51.        </form>
  52. <?php
  53.    }
  54. ?>
  55.  
  56. <script type="text/javascript">
  57.    //Redireccionar con el formulario creado
  58.    document.formulario.submit();
  59. </script>
  60.  
  61.  
  62.  
  63.  
  64.  


Título: Re: Hash y control de usuario
Publicado por: oscarcaronte en 1 Mayo 2020, 20:47 pm
Sé que se os revuelve el estómago con el código, que es además un refrito de otros, pero si me pudiérais ayudar sería genial.

Millones de gracias.


Título: Re: Hash y control de usuario
Publicado por: MetaNoia en 4 Mayo 2020, 19:57 pm
Buenas, veo varias cosas que se pueden mejorar en tu código:

1. Siempre que quieras redirigir a una determinada pagina puedes usar la función 'header' de php para mandar determinadas cabeceras, en este caso concreto puedes usar la cabecera 'Location' seguida del fichero a donde lo quieras redirigir.Por ejemplo:
Código
  1. header('Location: index.php');'

2. Y por ultimo para acceder a los datos del array '$_SESSION' en vez de pasárselo en formularios con parámetros ocultos solo debes poner 'session_start()' en todos los ficheros php que vas a necesitar tales datos, de esta forma podrás acceder a los datos del array sin problema.
Por ejemplo, en el index.php puedes poner session_start() al inicio del fichero y acceder al uid del usuario de forma normal, $_SESSION['uid']

3.Con lo que preguntas de comprobar las contraseñas es cifrar la contraseña que ha metido el usuario en el formulario y comprobar si su hash correspondiente es valido con el hash de la contraseña en la base de datos.
Código
  1. <?php
  2. $hash = password_hash($pw, PASSWORD_DEFAULT, array("cost"=>12));
  3. $isOk = password_verify($passUserBD, $hash);


Al código te faltaría meterle mas consultas sql pero te he ordenado lo de redirigir a los usuarios.
Código
  1. <?php
  2.    //conectar BD
  3.    include("conectar_bd.php");
  4.    conectar_bd();
  5.  
  6.    $usr = $_POST['usuario'];
  7.    $pw = $_POST['password'];
  8.    //Obtengo la version cifrada del password
  9.    $pw_enc =password_hash($pw, PASSWORD_DEFAULT, array("cost"=>12));
  10.  
  11.    $result=$conexio->query("SELECT id_usuario FROM tbl_users
  12.            INNER JOIN ctg_tiposusuario
  13.            ON tbl_users.id_TipoUsuario = ctg_tiposusuario.id_TipoUsuario
  14.            WHERE tx_username = '".$usr."'
  15.            AND tx_password = '".$pw_enc."' ");
  16.  
  17.    $uid = "";
  18.  
  19.    //Si existe al menos una fila
  20.    if( $fila=$result->fetch_array(MYSQLI_ASSOC))
  21.    {
  22.        //Obtener el Id del usuario en la BD
  23.        $uid = $fila['id_usuario'];
  24.        //Iniciar una sesion de PHP
  25.        session_start();
  26.        //Crear una variable para indicar que se ha autenticado
  27.        $_SESSION['autenticado'] = 'SI';
  28.        //Crear una variable para guardar el ID del usuario para tenerlo siempre disponible
  29.        $_SESSION['uid'] = $uid;
  30.        //CODIGO DE SESION
  31.        header('Location: principalcero.php');
  32.    }
  33.    else
  34.    {
  35.        //En caso de que no exista una fila...
  36.        header('Location: index.php');
  37.    }
  38.  

Un saludo