#django #django-rest-framework #timing-attack
Вопрос:
У меня есть разные представления REST-API, в которых я либо отправляю почту (если существует учетная запись), либо не отправляю почту. Например, пользователь может ввести электронное письмо в форму «Забыли пароль», и письмо будет отправлено, если учетная запись существует.
Я использую from django.core.mail import send_mail
для отправки почты.
Проблема в том, что это занимает некоторое время, и поэтому запросы на действительные электронные письма обычно длиннее, чем запросы на неисполненные электронные письма. Это позволяет злоумышленнику сравнить время запроса, чтобы выяснить, существует учетная запись или нет.
Есть ли какой-нибудь способ, которым я могу позвонить send_mail()
, не отправляя почту? Или как можно было бы исправить ситуацию, чтобы время запроса было одинаковым для обоих случаев?
Примечание: Я мог бы проверить, сколько времени в среднем требуется send_mail (), и подождать это время, если я не отправлю письмо. Поскольку приложение работает на разных серверах с разными конфигурациями, в моем случае это обычно невозможно сделать. Я бы предпочел не хранить среднее время выполнения на сервере в базе данных, чтобы решить эту проблему.
Ответ №1:
Это обычная практика-использовать сельдерей для задач, для выполнения которых требуется некоторое время. Сельдерей выполнит задачу в отдельном потоке, и пользователю не нужно ждать, пока она будет завершена. В вашем конкретном случае, что произойдет, если вы используете сельдерей:
- Вы отправляете задание
send_mail
в сельдерей и немедленно возвращаете пользователю успешный ответ. - Сельдерей получает задачу и запускает ее в отдельном потоке.
Таким образом, время отклика в обоих случаях будет одинаковым.
Ответ №2:
Так что это что-то похожее на проблему, с которой я столкнулся, и мое решение на самом деле состояло в том, чтобы всегда отправлять электронное письмо, но в письме читается что-то вроде You tried to reset your password, but this email isn't registered to an account with us.
«если у них нет учетной записи».
С точки зрения пользователя, может быть неприятно ждать сообщения электронной почты, которое может прийти или не прийти, и тратить время на проверку спама/нежелательной почты и т.д. Сказать им, что у них нет учетной записи с этим адресом электронной почты, для них быстрее и чище.
Мы увидели большое падение числа пользователей, обращавшихся к нам с вопросами о том, почему они не получили электронное письмо о сбросе PW.
(Извините, что на самом деле не ответил на вопрос, мне не нравится, когда люди делают это на SO, но так как я столкнулся с той же проблемой, я решил взвесить.)