代码之家  ›  专栏  ›  技术社区  ›  robins

在codeigniter中忘记密码

  •  2
  • robins  · 技术社区  · 9 年前

    我需要在登录页面中设置一个忘记的密码。首先我验证电子邮件,然后生成一个字符串,然后向特定邮件发送一个带有密钥和电子邮件的链接。

    我知道如何重置,但发生了什么,收到了该邮件的链接

    $message= "<a href='".base_url()."user/reset_pass/$key/$email'>";
    

    这是我提供的链接。

    3 回复  |  直到 5 年前
        1
  •  3
  •   RiggsFolly    9 年前

    基本流程应该是这样的:

    • 用户点击忘记密码
    • 验证DB上是否存在电子邮件或用户ID
    • 创建 key
    • 更新 钥匙 time 数据库中的用户行(需要2列)
    • 创建包含链接但仅使用 KEY 电子邮件地址是不必要的,可能会被嗅探,这可能会被用来破坏这个过程。

      <a href='".base_url()."user/reset_pass/$key'>

    用户单击他们收到的电子邮件上的链接

    • 运行用户控制器reset_pass方法,并将密钥作为参数传递
    • 在用户表中搜索关键字

    如果未找到

    • 把用户扔到某处,可能是黑客

    如果找到但超过了时间限制

    • 使用新密钥生成另一封电子邮件
    • 用新的更新用户表 钥匙 时间

    如果找到并且时间在限制内

    • 向用户抛出重置密码视图

    重置密码后

    • 更新用户表集 钥匙 时间 列设置为NULL
        2
  •  1
  •   Bugfixer    9 年前

    首先,当用户单击忘记密码时,您需要检查会话是否存在。 若否,则为您将从用户处接收的电子邮件设置验证方法。

    这样地:

    $this->form_validation->set_rules('email', 'Email', 'required|valid_email|callback_email_exists');
    

    在里面 email_exists 方法,检查是否存在具有给定电子邮件id的用户。

    如果用户存在,则创建邮件功能。重置密码的消息发送链接。

    $slug = md5($user->user_id . $user->email . date('Ymd'));
        $this->email->message('To reset your password please click the link below and follow the instructions:
    
    '. site_url('forgotpassword/reset/'.$user->user_id .'/'. $slug) .'
    If you did not request to reset your password then please just ignore this email and no changes will occur.
    Note: This reset code will expire after '. date('j M Y') .'.');
    

    并发送邮件。

    当用户单击重置链接时,该方法将再次检查会话。如果会话存在,则重定向到主页,否则从url获取第三和第四段。

    $user_id = $this->uri->segment(3);
    if(!$user_id) show_error('Invalid reset code.');
    $hash = $this->uri->segment(4);
    if(!$hash) show_error('Invalid reset code.');
    

    正在从url获取用户id。再次制造 $slug 从db值并将其与url进行比较 $鼻涕虫 .如果两者都匹配,则向用户提供重置字段以及密码和确认密码。

    如果两个密码都匹配。更新密码。

        3
  •  1
  •   Mahabub Islam Prio    9 年前

    我不会尝试将电子邮件地址作为重置密码的获取方法。 您只需发送一个哈希键作为url,即可完成任务。这些哈希键将作为令牌数据进行验证,并在有限的时间内处于活动状态。

    推荐文章