php - 如何以安全的方式提供密码重置功能?

标签 php security passwords

我目前正在完成一个网站,要求用户创建个人帐户才能玩托管在同一网站上的游戏。我目前难以弄清楚的是如何在忘记密码的情况下为用户实现安全的密码重置功能。

这是当前的流程:

第 1 步:用户点击网站上的“忘记密码”链接。
第 2 步:用户进入表单并在发送电子邮件之前输入两次电子邮件地址。
第 3 步:电子邮件包含指向另一个表单的链接,用户可以在其中输入新密码两次以进行确认。输入第二种形式后,系统将一条新记录插入到数据库中我的 Recover_Password 表中,该表包含“id”、“token”、“created_at”和“expires_at”列。

这是链接 -> (mywebsitename).com/form?id=99999&token=
其中“id”是用户的 ID,“token”是从 do_hash($id . date('Y-m-d')) 生成的

第 4 步:用户填写表单并进入登录页面。系统从数据库中清除 token 记录,并从用户表中更新用户当前密码。

我还想知道如果用户在第二种形式时尝试刷新浏览器页面该怎么办。我目前只允许在 get 参数中有 id 和 token 值并且它们都存在于数据库中时访问该页面。

我在整个网站上使用 Codeigniter,我需要知道这样做是否安全,以及我应该如何处理 token 和数据库。谢谢!!

最佳答案

处理密码重置的安全方法可能如下所示:


密码重置请求:

  1. 用户打开密码重置请求表单并输入电子邮件地址(无需输入两次,只需进行语法验证)。

  2. 您的应用程序检查电子邮件是否存在于您的数据库中。如果它存在,它会创建一个 token ,该 token 应该是随机的,而不是从用户 ID 或时间戳等信息中派生的。 token 的散列 将与用户 ID 和到期日期一起存储在数据库中的单独表中。带有 token 的链接会通过电子邮件发送给用户。

  3. 应用程序显示电子邮件已发送的确认信息。此页面可以包含电子邮件地址,因此用户可以检查他是否有拼写错误(毕竟没有关于电子邮件是否在数据库中的信息,因此攻击者无法测试其存在)。

密码重置:

  1. 用户单击链接并打开重置表单。在此表格上,他可以输入新密码两次。 token 必须作为隐藏的输入标签包含在表单中。

  2. 提交表单后,应用程序会检查他的 token 。如果匹配且未过期,则可以修改密码,用户可以直接登录(可以免去他的登录表单)。最后应该停用 token ,我自己更愿意保留条目,这样当用户再次单击链接时我可以通知用户 token 已被使用。

您将遇到的一个问题是,您必须在数据库中找到 token 的哈希值。有两种可能的方式来存储 token :

  • 您使用 SHA512 等无盐哈希算法对 token 进行哈希处理。如果 token 非常强(最小长度为 20,0-9 a-z A-Z),这是安全的。从理论上讲,您必须在将这样的哈希值输入数据库之前检查它是否已经存在,实际上这是可以忽略不计的。我实现了一个 password-reset class可以处理此类 token 。

  • 您使用 BCrypt 和盐对 token 进行哈希处理。这允许使用更短的 token ,但您无法在数据库中搜索散列 token 。相反,您必须在链接中包含行 ID 才能找到 token 。

关于php - 如何以安全的方式提供密码重置功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18325681/

相关文章:

email - 恢复管理员密码和电子邮件 Odoo 服务器

http - 您可以修改传出 HTTP 请求的正文吗?

MYSQL密码问题

javascript - Jquery从php/json文件加载数据并将新内容附加到div以进行聊天

php文件不输出结果

java - 使用多个查询时 Java 和 MySQL 中的 SQL 注入(inject)

security - &sa=U&ei 是什么意思?

visual-studio-2010 - 如何在vc++中创建密码字段和按钮

php - 根据用户选择检索mysql表数据并显示在html表中

php - Mysql查询语法失败