Ver Mensaje Individual
  #1 (permalink)  
Antiguo 30/09/2014, 15:02
Avatar de loncho_rojas
loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 16 años, 2 meses
Puntos: 175
Validar mail y password con PDO - Pequeño inconveniente

Buenas, me gustaría que me ayuden a resolver esto de manera inteligente y acorde con la necesidad que tengo.

Bueno, resulta que hago un logueo y utilizo PDO, y me surge un tropiezo de que necesito limitar la cantidad de intentos del usuario. Mi jefe me ha pedido que por seguridad bloquee al usuario por X tiempo, por seguridad, ya sea que estén intentando usar su identidad o que sea un robot. Tiene sus PRO y CONTRAS. Se entiende.

El inconveniente es el siguiente, no es tan grave, pero debo saltarlo, pido por SQL los datos por el EMAIL, que sería el usuario... Si verifico que el mail existe, como segundo paso comparo las claves. Si la clave es correcta, lo logueo y reseteo los intentos, si tiene un fallo de clave hago un update para sumar un intento fallido... mi gran problema se da en la SEGURIDAD del DATO PASSWORD.. verán porque en el código.

Código PHP:
//recibo los datos ya validados por JS
$email $_POST["email"];
$clave $_POST["password"];

//como ejemplo, verifico si el mail existe
$sql_login="SELECT * FROM users WHERE emailUser = :email";    
$resultado_login $dbcon->prepare($sql_login);
$resultado_login->bindParam(':email'$emailPDO::PARAM_STR);
$resultado_login->execute();

if(
$resultado_login->rowCount() == 1){
        echo 
"hay este mail<br>";
//busco los datos del user si existe
        
$fila_usuario=$resultado_login->fetch();

        if(
$fila_usuario['intentos'] < 5){ echo "es menor a 5 intentos<br>";

            
//ACA ESTA MI PROBLEMA... se dan cuenta que no BLINDÉ mi clave?
            
if($fila_usuario['pass']== $clave){
//logue al usuario
            
}else{
//hago un update para aumentar los intentos
$sql_in"UPDATE users SET ultimointento=NOW(), intentos=intentos+1 WHERE idUser = :idUser";
        
$insert$dbcon->prepare($sql_in);
        
$insert->bindParam(':idUser' $fila_usuario['idUser'], PDO::PARAM_INT);
        
$insert->execute();

            }

        }else{
//aqui hago el proceso de bloqueo si es que no ha pasado el tiempo de baneo
        
}


}else{
            echo 
"<div class='campo_error'>
            <img src='login_temp/wrong.png' />
            La direcci&oacute;n de email ingresada no est&aacute; registrada
            </div>"
;

En la descripción explico el problema, que es.. al hacer el select para traer los datos del user, uso el email, y ese dato va protegido, luego verifico si la CLAVE es correcta, pero el parámetro de la CLAVE, no lo pude proteger para verificar.

Por qué no verifico ambos a la vez en el login? Porque la idea es bloquear el ID del usuario cuyo mail esté siendo utilizado con reiterados fallos en la clave, y para obener el ID es necesario que el mail sea esté registrado y a partir de ahi generar las verificaciones...

Podría validar ambos, a la vez, pero ya no sabría qué bloquear, pues, si falla la dir de email, puede que solo no esté registrada o fallos de escritura, pero cómo bloqueo a un usuario cuyo mail no existe?

Cómo puedo blindar el parámetro de CLAVE siguiendo esta estructura, ya que meter mysql_real_escape_string no es una opcion válida en PDO? O tendría que hacer un Select primero para ver si el mail está registrado, y luego otro Select para verificar si tanto el email como el password coinciden? Aunque me parece redundante.

Por favor ayúdenme.
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...

Última edición por loncho_rojas; 30/09/2014 a las 15:07