为什么Django的用户模型将电子邮件字段设置为非唯一?

时间:2013-07-07 17:15:05

标签: python django security django-models

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

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

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

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

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

  1. 理由是什么?
  2. 显然,密码重置功能与电子邮件相关联,因此如果我根据电子邮件重置密码,哪个用户(在按照密码重置链接后)将被重置?
  3. 如何使电子邮件字段与众不同?

2 个答案:

答案 0 :(得分:5)

密码重置功能确实是based on email addresses

它会向all accounts that have a corresponding email发送重置电子邮件。

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


使用以下方法可以覆盖所有这些:

  • 自定义密码重置表单
  • 自定义用户模型

答案 1 :(得分:1)

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

此外,由于电子邮件地址不是必需的,因此它在数据库中为空或空(两者都不是唯一的密钥)。

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

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