Django Allauth阻止电子邮件验证和密码重置电子邮件滥用/垃圾邮件

时间:2020-07-25 06:16:00

标签: django django-allauth throttling spam-prevention rate-limiting

我需要阻止用户滥用allauth的能力来向用户发送验证和密码重置电子邮件,以便我的电子邮件提供商不会临时中止我的电子邮件地址以发送太多电子邮件。

在/ accounts / email /页面上,用户可以单击所需的全部重新发送验证,并且每次单击都会发送一封电子邮件。

我注意到一个ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN设置,但并不完全确定它是如何工作的。我尝试对其进行测试,但仍然能够发送垃圾邮件,并且每次单击都会发送电子邮件。

在/ accounts / password / reset /页面上,会发生此问题:

https://github.com/pennersr/django-allauth/issues/2167

创建者提到要这样做以减轻压力:

https://github.com/pennersr/django-allauth/issues/1008

也许这可以用来解决两个问题?您将如何使用allauth代码实现它?

https://stackoverflow.com/a/2157688/13955916

限速或节流可以解决这个问题吗?如果是这样,那么此代码示例将是什么?

两个页面上都有Recaptcha v3。但这并不能阻止人类垃圾邮件农场。

我想出了一个客户端javascript cookie解决方案,但由于它不是服务器端解决方案,因此恐怕无法有效地阻止这些问题:

button.disabled,
button[disabled] {
    box-shadow: none;
    cursor: not-allowed;
    opacity: 0.5;
    pointer-events: none;
}
​
<button id="re-send" class="secondaryAction" type="submit" name="action_send" >{% trans 'Re-send Verification' %}</button>
​
​
<script>
  const resendBtn = document.getElementById("re-send");
  resendBtn.addEventListener("click", disable);
​
var cookieString = getCookie("cookieName");
if(cookieString == "mysite"){
    var btn = document.querySelector('#re-send');
    btn.classList.add('disabled');
}
​
function setCookie(){
   days=1;
   myDate = new Date();
   myDate.setTime(myDate.getTime()+(days*24*60*60*1000));
   document.cookie = 'cookieName=mysite; expires=' + myDate.toGMTString();
}
​
function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1);
        if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
    }
    return "";
}
​
  function disable() {
    var btn = document.querySelector('#re-send');
    btn.classList.add('disabled');
    setCookie();
  };
​
​
function runFunction(){
    var testElement = document.getElementById('re-send');
if (!testElement.classList.contains('disabled') && (getCookie("cookieName") == "mysite")) {
    var btn = document.querySelector('#re-send');
    btn.classList.add('disabled');
}
};
​
setInterval(runFunction,1000);
​
</script>

0 个答案:

没有答案