我最近创建了一个注册页面,用户可以在其中注册并创建自己的帐户。但是,如果我退出然后返回帐户并尝试登录,则只接受加密版本的密码。如何让我的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;
}
}
答案 0 :(得分:1)
在我看来,您的问题是注册密码是出于安全考虑而进行哈希处理。
在这种情况下,您必须知道使用了什么散列函数。例如crypt。在进行查询之前,您应该简单地加密用户输入。
$hashedPassword = crypt($password);
$this->db->select('*')->from('membership');
$this->db->where('username', $username);
$this->db->where('password', $hashedPassword);
$query = $this->db->get();
Here是PHP对密码散列的建议。
答案 1 :(得分: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等。
答案 2 :(得分:-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;
}