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', $email, PDO::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ón de email ingresada no está registrada
</div>";
}
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.