这个密码重置程序有什么问题吗?

时间:2011-12-10 13:38:36

标签: python security flask

这个程序有什么问题吗?

  1. 以重置形式输入用户名和电子邮件。
  2. Flask创建一个非常长的随机字符串并将其存储在“reset_code”下的会话中。会话还将有一个“reset_pw_username”
  3. 的键
  4. Flask发送一封电子邮件,其中包含指向路径/ password_reset / reset_pw_username / reset_code
  5. 的链接
  6. 如果会话重置代码与会话reset_code项匹配,则该链接显示客户可以重置密码的表单。否则就会爆炸。
  7. 会话将在一小时后过期重置代码。

4 个答案:

答案 0 :(得分:4)

如果我可以输入用户名和电子邮件地址,那么我可以通过电子邮件向我发送任何服务用户的重置令牌。也许您应该检查电子邮件地址是否真正属于要重置其密码的用户。

答案 1 :(得分:2)

您必须确保输入的用户名和电子邮件与其中一个帐户匹配(或首先使用电子邮件作为用户名)。

从可用性的角度来看,如果显示电子邮件中包含的链接的浏览器与最初使用的链接不同,则无法使用。

除此之外,你应该特别注意reset_code的随机性(而不是长度)。它应该是加密随机的(即os.urandom),以便攻击者不能简单地猜测它。 random.random和衍生方法不合适。

答案 2 :(得分:1)

正如Jean-Paul所指出的那样,要求用户名和电子邮件都需要检查它们是否都匹配同一个用户。因此,更常见的是要求 用户名或电子邮件,验证它们是否在您的数据库中,并将恢复链接发送到适当的地址。

如phihag所述,将恢复令牌存储在会话数据中可能对某些用户来说很麻烦。这种令牌通常存储在常规数据库中。但请注意,它们是密码等效的:一旦获得,它们可以自由地交换密码。因此,他们需要腌制&在存储到数据库之前散列(以与密码本身相同的安全方式)。这也意味着您的恢复处理程序必须是salt&在数据库中搜索传入令牌之前对其进行哈希处理。

答案 3 :(得分:0)

最佳解决方案是使用电子邮件地址作为用户名,然后用户只需记住他的电子邮件地址。您只需验证用户的电子邮件地址。