Предотвращение атаки django send_mail timimg

#django #django-rest-framework #timing-attack

Вопрос:

У меня есть разные представления REST-API, в которых я либо отправляю почту (если существует учетная запись), либо не отправляю почту. Например, пользователь может ввести электронное письмо в форму «Забыли пароль», и письмо будет отправлено, если учетная запись существует.

Я использую from django.core.mail import send_mail для отправки почты.

Проблема в том, что это занимает некоторое время, и поэтому запросы на действительные электронные письма обычно длиннее, чем запросы на неисполненные электронные письма. Это позволяет злоумышленнику сравнить время запроса, чтобы выяснить, существует учетная запись или нет.

Есть ли какой-нибудь способ, которым я могу позвонить send_mail() , не отправляя почту? Или как можно было бы исправить ситуацию, чтобы время запроса было одинаковым для обоих случаев?

Примечание: Я мог бы проверить, сколько времени в среднем требуется send_mail (), и подождать это время, если я не отправлю письмо. Поскольку приложение работает на разных серверах с разными конфигурациями, в моем случае это обычно невозможно сделать. Я бы предпочел не хранить среднее время выполнения на сервере в базе данных, чтобы решить эту проблему.

Ответ №1:

Это обычная практика-использовать сельдерей для задач, для выполнения которых требуется некоторое время. Сельдерей выполнит задачу в отдельном потоке, и пользователю не нужно ждать, пока она будет завершена. В вашем конкретном случае, что произойдет, если вы используете сельдерей:

  1. Вы отправляете задание send_mail в сельдерей и немедленно возвращаете пользователю успешный ответ.
  2. Сельдерей получает задачу и запускает ее в отдельном потоке.

Таким образом, время отклика в обоих случаях будет одинаковым.

Ответ №2:

Так что это что-то похожее на проблему, с которой я столкнулся, и мое решение на самом деле состояло в том, чтобы всегда отправлять электронное письмо, но в письме читается что-то вроде You tried to reset your password, but this email isn't registered to an account with us. «если у них нет учетной записи».

С точки зрения пользователя, может быть неприятно ждать сообщения электронной почты, которое может прийти или не прийти, и тратить время на проверку спама/нежелательной почты и т.д. Сказать им, что у них нет учетной записи с этим адресом электронной почты, для них быстрее и чище.

Мы увидели большое падение числа пользователей, обращавшихся к нам с вопросами о том, почему они не получили электронное письмо о сбросе PW.

(Извините, что на самом деле не ответил на вопрос, мне не нравится, когда люди делают это на SO, но так как я столкнулся с той же проблемой, я решил взвесить.)