2

我有不同的 REST-API 视图,我可以在其中发送邮件(如果存在帐户)或不发送邮件。例如,用户可以以忘记密码的形式输入电子邮件,如果帐户存在则发送邮件。

from django.core.mail import send_mail用来发送邮件。

问题是,这需要一些时间,因此对有效电子邮件的请求通常比对非退出电子邮件的请求长。这允许攻击者比较请求时间以找出帐户是否存在。

有什么方法可以打电话send_mail()而不发邮件吗?或者,对于这两种情况,使请求时间同样长的解决方法是什么?

注意:如果我不发送邮件,我可以检查 send_mail() 平均需要多长时间并等待这个时间。由于该应用程序在具有不同配置的不同服务器上运行,因此在我的情况下通常无法做到这一点。我宁愿不将每台服务器的平均执行时间存储在数据库中来解决这个问题。

4

2 回答 2

2

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

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

这样,两种情况的响应时间将相同。

于 2021-08-19T09:03:02.043 回答
1

所以这与我遇到的问题类似,我的解决方案实际上是始终发送电子邮件,但电子邮件的内容类似于You tried to reset your password, but this email isn't registered to an account with us.他们没有帐户。

从用户的角度来看,不得不等待可能会或可能不会到达的电子邮件,并花时间检查垃圾邮件/垃圾邮件等可能会很烦人。告诉他们他们没有使用该电子邮件地址的帐户会更快更干净他们。

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

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

于 2021-08-19T08:55:56.777 回答