【问题标题】:Prevent django send_mail timimg attack防止django send_mail timimg 攻击
【发布时间】:2021-10-20 23:12:27
【问题描述】:

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

我正在使用from django.core.mail import send_mail 发送邮件。

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

有什么方法可以在不发送邮件的情况下拨打send_mail() 吗? 或者如何解决这两种情况的请求时间相同?

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

【问题讨论】:

    标签: django django-rest-framework timing-attack


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多