Hash y control de usuario

Iniciado por oscarcaronte, 1 Mayo 2020, 18:01 PM

0 Miembros y 1 Visitante están viendo este tema.

oscarcaronte

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 (php) [Seleccionar]
$pw_enc = md5($pw); 

Y ahora quisiera en ese código utilizar

Código (php) [Seleccionar]
$pw_enc =password_hash($pw, PASSWORD_DEFAULT, array("cost"=>12));



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 (php) [Seleccionar]

<?php

 
    
//conectar BD
    
include("conectar_bd.php");  
    
conectar_bd();
     
    
$usr $_POST['usuario'];
    
$pw $_POST['password'];
    
//Obtengo la version cifrada del password
    
$pw_enc md5($pw);

    
     
    
    
$result=$conexio->query("SELECT id_usuario FROM tbl_users
            INNER JOIN ctg_tiposusuario
            ON tbl_users.id_TipoUsuario = ctg_tiposusuario.id_TipoUsuario
            WHERE tx_username = '"
.$usr."'
            AND tx_password = '"
.$pw_enc."' "); 
 
    
$uid "";
     
    
//Si existe al menos una fila
    
if( $fila=$result->fetch_array(MYSQLI_ASSOC))
    {       
        
//Obtener el Id del usuario en la BD        
        
$uid $fila['id_usuario'];
        
//Iniciar una sesion de PHP
        
session_start();
        
//Crear una variable para indicar que se ha autenticado
        
$_SESSION['autenticado'] = 'SI';
        
//Crear una variable para guardar el ID del usuario para tenerlo siempre disponible
        
$_SESSION['uid'] = $uid;
        
//CODIGO DE SESION
         
        //Crear un formulario para redireccionar al usuario y enviar oculto su Id 
?>

        <form name="formulario" method="post" action="principalcero.php">
            <input type="hidden" name="idUsr" value='<?php echo $uid ?>' />
        </form>
<?php
    
}
    else {
        
//En caso de que no exista una fila...
        //..Crear un formulario para redireccionar al usuario a la pagina de login 
        //enviandole un codigo de error
?>

        <form name="formulario" method="post" action="index.php">
            <input type="hidden" name="msg_error" value="1">
        </form>
<?php
    
}
?>

                     
<script type="text/javascript">
    //Redireccionar con el formulario creado
    document.formulario.submit();
</script>





oscarcaronte

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.

mr-medi

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 (php) [Seleccionar]
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 (php) [Seleccionar]
<?php
$hash 
password_hash($pwPASSWORD_DEFAULT, array("cost"=>12));
$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 (php) [Seleccionar]

<?php
    
//conectar BD
    
include("conectar_bd.php");
    
conectar_bd();

    
$usr $_POST['usuario'];
    
$pw $_POST['password'];
    
//Obtengo la version cifrada del password
    
$pw_enc =password_hash($pwPASSWORD_DEFAULT, array("cost"=>12));

    
$result=$conexio->query("SELECT id_usuario FROM tbl_users
            INNER JOIN ctg_tiposusuario
            ON tbl_users.id_TipoUsuario = ctg_tiposusuario.id_TipoUsuario
            WHERE tx_username = '"
.$usr."'
            AND tx_password = '"
.$pw_enc."' ");

    
$uid "";

    
//Si existe al menos una fila
    
if( $fila=$result->fetch_array(MYSQLI_ASSOC))
    {
        
//Obtener el Id del usuario en la BD
        
$uid $fila['id_usuario'];
        
//Iniciar una sesion de PHP
        
session_start();
        
//Crear una variable para indicar que se ha autenticado
        
$_SESSION['autenticado'] = 'SI';
        
//Crear una variable para guardar el ID del usuario para tenerlo siempre disponible
        
$_SESSION['uid'] = $uid;
        
//CODIGO DE SESION
        
header('Location: principalcero.php');
    }
    else
    {
        
//En caso de que no exista una fila...
        
header('Location: index.php');
    }


Un saludo

<?php
       header
("Location: TheHackerWay");