防止 django send_mail timimg 攻击

Prevent django send_mail timimg attack

我有不同的 REST-API 视图,我要么发送邮件(如果存在帐户)要么不发送邮件。 例如,用户可以在忘记密码的表单中输入电子邮件,如果该帐户存在,则会发送一封邮件。

我正在使用 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.

从用户的角度来看,不得不等待可能会收到也可能不会收到的电子邮件,并花时间检查 spam/junk 等,这可能很烦人。告诉他们他们没有该帐户电子邮件地址对他们来说更快更干净。

我们发现向我们询问为什么他们没有收到 PW 重置电子邮件的用户数量大幅下降。

(很抱歉没有真正回答这个问题,我不喜欢人们在 SO 上这样做但是因为我遇到了同样的问题,我想我会权衡一下。)

对于需要一些时间才能完成的任务,使用 celery 是一种常见的做法。 Celery 将 运行 在单独的线程中执行任务,用户无需等待任务完成。在你的具体情况下,如果你使用芹菜会发生什么:

  1. 您向 celery 发送任务 send_mail 并立即 return 向用户成功响应。
  2. Celery 收到一个任务,运行将它放在一个单独的线程中。

这样,两种情况下的响应时间是一样的。