这个程序有什么问题吗?
答案 0 :(得分:4)
如果我可以输入用户名和电子邮件地址,那么我可以通过电子邮件向我发送任何服务用户的重置令牌。也许您应该检查电子邮件地址是否真正属于要重置其密码的用户。
答案 1 :(得分:2)
您必须确保输入的用户名和电子邮件与其中一个帐户匹配(或首先使用电子邮件作为用户名)。
从可用性的角度来看,如果显示电子邮件中包含的链接的浏览器与最初使用的链接不同,则无法使用。
除此之外,你应该特别注意reset_code的随机性(而不是长度)。它应该是加密随机的(即os.urandom
),以便攻击者不能简单地猜测它。 random.random
和衍生方法不合适。
答案 2 :(得分:1)
正如Jean-Paul所指出的那样,要求用户名和电子邮件都需要检查它们是否都匹配同一个用户。因此,更常见的是要求 用户名或电子邮件,验证它们是否在您的数据库中,并将恢复链接发送到适当的地址。
如phihag所述,将恢复令牌存储在会话数据中可能对某些用户来说很麻烦。这种令牌通常存储在常规数据库中。但请注意,它们是密码等效的:一旦获得,它们可以自由地交换密码。因此,他们需要腌制&在存储到数据库之前散列(以与密码本身相同的安全方式)。这也意味着您的恢复处理程序必须是salt&在数据库中搜索传入令牌之前对其进行哈希处理。
答案 3 :(得分:0)
最佳解决方案是使用电子邮件地址作为用户名,然后用户只需记住他的电子邮件地址。您只需验证用户的电子邮件地址。