-4

我最近创建了一个注册页面,用户可以在其中注册并创建自己的帐户。但是如果我退出然后重新进入帐户并尝试登录,则只接受加密版本的密码。如何让我的 loguserin 函数与我的数据库对话并让它明白它实际上是用户最初输入的普通密码?

控制器:

 function loguserin()
 {

$this->load->helper(array('form', 'url'));

$this->load->library('form_validation');

$this->form_validation->set_rules('username', 'Username', 'required|min_length[4]|max_length[12]|callback_validateUser|trim');
$this->form_validation->set_rules('password', 'Password', 'required|md5|trim');


if ($this->form_validation->run())
{
    $username = $this->input->post('username');
    $password = $this->input->post('password');
    $this->session->set_userdata('status', 'OK');
    $this->session->set_userdata('username', $username);

    redirect('home');
}
else
{
    $this->session->set_userdata('status', 'NOT_OK');
    $this->load->view('shared/header');
    $this->load->view('account/logintitle');
    $this->load->view('account/loginview');
    $this->load->view('shared/footer');
}
 }



  function validateUser($username, $password)
  {
    $this->db->select('*')->from('membership');
    $this->db->where('username', $username);
    $this->db->where('password',MD5($password));
    $query = $this->db->get();
    if ($query ->num_rows ==1)
    {
    $this->form_validation->set_message('validateUser', 'Invalid username/password');

    return false;
}

else{

    return true;

}
}
4

3 回答 3

1

在我看来,您的问题是出于安全考虑,在注册时密码被散列。

在这种情况下,您必须知道使用了什么散列函数。例如地穴。比您应该在执行查询之前简单地加密用户输入。

    $hashedPassword = crypt($password);
    $this->db->select('*')->from('membership');
    $this->db->where('username', $username);
    $this->db->where('password', $hashedPassword);
    $query = $this->db->get();

以下是 PHP 对密码散列的建议。

于 2012-12-29T22:05:26.003 回答
1

CodeIgniter 似乎没有使用 MD5 加密密码。如指定set_rules()

$this->form_validation->set_rules('password', 'Password', 'required|md5|trim');

验证这一点的一种方法是将其内容转储到显示器上。例如..

var_dump( $this->input->post('password') );

如果密码看起来仍然是纯文本;然后 set_rules 没有在变量上运行 md5() ,这将需要一些故障排除。

为了将来参考,一般认证系统会将用户详细信息保存在数据库中;包括密码和用户名的散列版本。PHP 应用程序将启动一个 SQL 命令,例如SELECT password FROM users WHERE USERNAME=username如果没有返回行,则用户名不正确

然后通过散列方法运行用户输入 - 这与从数据库中检索到的值进行比较。如果这些不匹配,则密码错误

但是,您似乎在数据库查询中同时发送了密码和用户名;虽然这会起作用 - 您将无法确定是错误的用户名还是错误的密码导致了身份验证问题。

出于这样的原因,通常最好...

尝试并使用身份验证框架

有被击落的危险;不要尝试为生产项目编写自己的身份验证代码。只需稍稍疏忽一下,您就可能危及整个应用程序、用户数据等。

那里有一些非常好的久经考验的身份验证框架——我最喜欢的是ion auth,因为它很简单。但是,您可能会找到更喜欢的其他人。

不要只加密密码;散列它们。

这听起来像是细微的差别;但它实际上非常重要。在您的数据库被破坏的情况下(虽然它很粗鲁!) - 对您的密码进行哈希处理可以提供更好的安全性。特别是当涉及到彩虹表之类的攻击时。

同样,不要使用md5()- PHP 具有crypt()尝试使用更安全算法的功能 -如果它在系统上可用。此外,它接受第二个参数(这是可选的,但应该使用) - salt

值得记住的是set_rules()可以使用crypt();至少以最简单的形式(有一个论点)。从文档中:

任何接受一个参数的原生 PHP 函数都可以作为规则使用,如 htmlspecialchars、trim、MD5 等。

于 2012-12-29T22:41:46.363 回答
-1

根据您用于存储密码的散列,您的模型配置将是这样的:

$this->db->select('*')->from('membership');
$this->db->where('username', $username);
$this->db->where('password', MD5($password));

此外,您的模型中存在用于检查用户是否有效的错误。如果从 DB 返回的行数为 1,则用户有效,否则无效。

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

else
{
    $this->form_validation->set_message('validateUser', 'Invalid username/password');
    return false;
}
于 2012-12-29T21:56:01.060 回答