【问题标题】:CodeIgniter password not validating against databaseCodeIgniter 密码未针对数据库进行验证
【发布时间】:2012-01-06 03:39:33
【问题描述】:

我已经在 CodeIgniter(电子邮件/密码)中设置了我的登录功能。电子邮件字段正在根据数据库正确验证,但只要电子邮件经过验证,任何密码都被接受——即使是空白密码。

我需要弄清楚为什么只针对数据库检查电子邮件字段以及如何获取密码字段以针对数据库进行验证。

边栏:我计划接下来加密密码,但要确保该字段首先针对数据库进行验证。然后我将添加安全层。

从登录控制器:

 function login_validation()

{
    $this->load->model('foo_model');
    $query = $this->foo_model->validate();

    if($query) 
    {
        $data = array(
            'email' => $this->input->post('email'),
                            'password' => $this->input->post('password'),
            'is_logged_in' => true
        );
        $this->session->set_userdata($data);
        redirect('foodash');
    }
    else
    {
        $this->index(); // login page
    }
}

来自 foo 模型:

function validate()
{
    $this->db->where('email', $this->input->post('email'));
    $this->db->where('password', $this->input->post('password'));

    $query = $this->db->get('footable');

    if($query->num_rows == 1)
    {
        return true;
    }           
}   

}

想通了: 我正在使用 jquery 屏蔽我的密码字段,以便输入时文本不可见。我不得不更改密码字段的名称——一旦我在模型中更改了它,一切都运行良好。

【问题讨论】:

    标签: codeigniter passwords


    【解决方案1】:

    想通了:

    我使用 jquery 掩盖了我的密码字段,因此输入时文本不可见。我不得不更改密码字段的名称——一旦我在模型中更改了它,一切都运行良好。

    【讨论】:

      【解决方案2】:

      尝试在您的validate() 函数中在您的IF 语句之后返回false

      也可以尝试不同的语法:

      $query = $this->db->get_where('footable', array(
          'email' => $this->input->post('email'),
          'password' => $this->input->post('password')
      ));
      

      【讨论】:

      • 使用此语法或在 IF 语句后使用 false 不会更改。不用密码或任何密码仍然可以登录。
      【解决方案3】:

      密码正在针对数据库进行验证,但当电子邮件或密码错误时,validate() 的返回值未定义。这可能会导致不可预知的结果。我推荐:

      function validate()
      {
          $this->db->where('email', $this->input->post('email'));
          $this->db->where('password', $this->input->post('password'));
      
          $query = $this->db->get('footable');
      
          return ($query->num_rows() == 1);
      }
      

      【讨论】:

      • 与我的代码相同的结果;电子邮件验证,接受任何密码(或无密码)。
      • 在 ($query->num_rows == 1) 中缺少括号,它必须是 ($query->num_rows() == 1)
      • 我看到了你的更新;尝试了您建议的 w/num_rows() 语法,我仍然可以使用任何密码或不使用密码登录。正在验证电子邮件,但未验证密码。
      • 你用的是什么数据库?有些数据库不喜欢“用户”或“密码”等特定字段名。也许重命名该字段会有所帮助。该字段是否包含 NULL?这也可能导致问题。你检查 $query 的结果了吗?它包含什么?
      • 使用mysql,字段不包含null。不知道如何检查 $query,因此不胜感激。
      猜你喜欢
      • 1970-01-01
      • 2018-09-09
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多