У меня есть обработчик для сброса пароля. Он всегда возвращает успешный код состояния 200, поэтому злоумышленник не может использовать его, чтобы узнать, какие адреса электронной почты хранятся в базе данных. Проблема в том, что если электронное письмо находится в базе данных, выполнение запроса займет некоторое время (блокировка поиска пользователя и отправка фактического электронного письма с токеном сброса). Если пользователя нет в базе данных, запрос возвращается очень быстро, поэтому атакованный будет знать, что электронной почты там нет.
Как мне сразу же вернуть ответ HTTP при обработке запроса в фоновом режиме?
pub async fn forgot_password_handler(
email_from_path: web::Path<String>,
pool: web::Data<Pool>,
redis_client: web::Data<redis::Client>,
) -> HttpResponse {
let conn: &PgConnection = &pool.get().unwrap();
let email_address = &email_from_path.into_inner();
// search for user with email address in users table
match users.filter(email.eq(email_address)).first::<User>(conn) {
Ok(user) => {
// some stuff omitted.. this is what happens:
// create random token for user and store a hash of it in redis (it'll expire after some time)
// send email with password reset link and token (not hashed) to client
// then return with
HttpResponse::Ok().finish(),
}
_ => HttpResponse::Ok().finish(),
}
}