6

我正在使用 Django 的默认用户模型,并且电子邮件不是唯一的,现在我有多个用户使用相同的电子邮件地址。

您可以让 User_A 使用电子邮件地址 user_a@example.com,然后新用户 User_B 可以使用相同的电子邮件地址 user_a@example.com 注册。

这在任何编程领域都没有意义,并且会导致与电子邮件发送功能混淆,并可能导致密码重置错误(如果发送密码重置链接,两个用户共享相同的电子邮件地址)。

正如我所见,这并没有明显的安全漏洞,因为只有原始用户才能控制原始电子邮件地址,因此攻击者不会收到重置电子邮件。

但是,这可能会导致原始用户 User_A 被锁定在其原始帐户之外(如果他忘记了密码)并被阻止发出密码重置,因为 Django 仅尝试重置新用户 User_B。显然 User_A 想要访问他的帐户,而不是 User_B 的帐户。

  1. 理由是什么?
  2. 显然,密码重置功能与电子邮件相关联,所以如果我根据电子邮件重置密码,哪个用户(按照密码重置链接)将被重置?
  3. 如何使电子邮件字段独一无二?
4

2 回答 2

6

密码重置功能确实基于电子邮件地址

它将向所有具有相应电子邮件的帐户发送重置电子邮件

传递给电子邮件模板的上下文包括user,因此您的电子邮件重置消息可能包含用户名,以让用户识别这将重置哪个密码。


所有这些都可以通过使用来覆盖:

  • 自定义密码重置表单
  • 自定义用户模型
于 2013-07-07T17:49:40.780 回答
0

django.contrib.auth 使用用户名字段来标识用户,而不是电子邮件地址,因此如果两个用户具有相同的电子邮件地址,则不会发生冲突。

此外,由于不需要电子邮件地址,因此它在数据库中为空白或 null (这两者都不是良好的唯一键)。

对于您的其他问题 - 密码重置将重置请求它的用户的密码,因为它是按用户名请求的。

拥有两个具有相同地址的帐户会非常方便。例如,可能一个是管理员帐户,另一个是普通用户。

于 2013-07-07T17:47:02.940 回答