我一直在使用CodeIgniter为网站开发登录库。验证码如下:
function signin($username, $password)
{
$CI =& get_instance();
$query_auth=$this->db->query('SELECT user_id, banned FROM user WHERE username=? AND password=SHA1(CONCAT(?,salt)) LIMIT 1', array($username, $password));
if($query_auth->num_rows()!=1)
return 2;
else
{
if($query_init->row()->banned==1)
return 3;
else
{
$CI->load->library('session');
$this->session->set_userdata('gauid', $query_auth->row()->user_id);
return 1;
}
}
}
返回值表示成功,失败或被禁止。每个用户都有一个存储在数据库中的唯一salt。
最初我从数据库中抓取了盐,将用户输入的密码和盐从PHP中的数据库中合并,然后再次使用组合值查询数据库。我认为这会加快速度,因为只需要一次数据库之旅,而且代码更少。我也认为它同样安全,但是在阅读了对这个问题的最高回应之后 Salting my hashes with PHP and MySQL ......
首先,您的DBMS(MySQL)可以 不需要任何支持 密码哈希。你可以做到 那个在PHP方面,那就是 还有你应该做的。
......我开始怀疑是否存在我忽略的安全问题。
这段代码到底有什么问题吗?
答案 0 :(得分:2)
本身没有任何错误。请记住,携带未加密/未加密密码的任何流量都是可疑的。因此,例如,当服务器是远程服务器,并且在与该服务器通信时不使用加密时,又是尝试拦截密码的时刻。此外,如果查询被记录在某处(默认情况下,或者因为它们很慢),那么在您遇到所有麻烦之后,您将拥有一个普通密码+您正在使用的那些服务器中使用的盐,而不是存储明文密码某处。如果你在自己的代码中私下进行,那就不会发生。
这完全取决于你喜欢多么偏执。有更容易滥用和经常被遗忘的邪恶,如会话固定。