Предотвращение атаки timimg на django send_mail
У меня есть различные REST-API представления, в которых я либо отправляю письмо (если аккаунт существует), либо не отправляю письмо. Например, пользователь может ввести email в форму забытого пароля, и письмо будет отправлено, если аккаунт существует.
Я использую from django.core.mail import send_mail
для отправки почты.
Проблема в том, что это занимает некоторое время, и поэтому запросы на действительные электронные адреса обычно длиннее, чем запросы на несуществующие электронные адреса. Это позволяет злоумышленнику сравнить время запроса, чтобы выяснить, существует ли учетная запись или нет.
Есть ли способ, чтобы я мог вызвать send_mail()
без отправки почты?
Или что нужно сделать, чтобы время запроса было одинаково долгим для обоих случаев?
Примечание: Я мог бы проверить, сколько времени в среднем требуется send_mail(), и ждать это время, если я не отправляю почту. Поскольку приложение работает на разных серверах с разными конфигурациями, в моем случае это невозможно. Я бы не хотел хранить среднее время выполнения для каждого сервера в базе данных, чтобы решить эту проблему.
Так что это похоже на проблему, с которой я столкнулся, и мое решение заключалось в том, чтобы всегда отправлять электронное письмо, но письмо читается примерно так You tried to reset your password, but this email isn't registered to an account with us.
если у них нет аккаунта.
С точки зрения пользователя, может раздражать необходимость ждать письмо, которое может прийти, а может и не прийти, тратить время на проверку спама/мусора и т.д. Сказать им, что у них нет учетной записи с таким адресом электронной почты, будет быстрее и чище для них.
Мы наблюдали значительное снижение количества пользователей, спрашивающих нас о том, почему они не получили письмо о сбросе PW.
(Извините, что не ответил на вопрос, мне не нравится, когда люди делают это на SO, но поскольку я столкнулся с той же проблемой, я решил высказаться.)
Обычно принято использовать celery для задач, требующих некоторого времени для завершения. Celery запускает задачу в отдельном потоке, и пользователю не нужно ждать, пока она завершится. В вашем конкретном случае, что произойдет, если вы используете celery:
- You send a task
send_mail
to celery and immediately return a successful response to a user. - Celery receives a task and runs it in a separate thread.
Таким образом, время ответа для обоих случаев будет одинаковым.