2010-07-19 100 views
0

我一直在使用CodeIgniter开发一个网站的登录库。验证码如下:在PHP和MySQL中腌制

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

可能重复的[安全散列和咸的PHP密码](http://stackoverflow.com/questions/401656/secure-hash-and-salt-for-php-passwords) – rook 2010-07-19 19:34:57

+0

我不明白这是怎么回事真正!这些问题是完全不同的。 – j82374823749 2010-07-19 19:44:03

+0

然后它应该被关闭,因为太局部。 – rook 2010-07-19 19:46:09

回答

2

本身没有任何问题。请记住任何携带未加密/未加密密码的流量都是可疑的。因此,例如,当服务器是远程服务器,而不是与加密服务器通信时,它是尝试截取密码的又一时刻。另外,如果查询记录在某处(默认情况下,或者因为它们很慢),那么您有一个普通的密码+您正在使用的salt坐在这些serverlog中,在经历了所有麻烦之后,您不需要存储明文密码某处。如果你在自己的代码中私下执行,那不会发生。

这一切都取决于你喜欢怎么偏执。虐待事件要容易得多,而且经常会忘记邪恶事件,如会话固定。

+0

对不起,本身就是宠物。 :) – 2010-07-19 19:33:06

+0

只要你正在考虑像这样的安全问题,我不会把所有密码尝试记录在明文中作为次要事情。否则如上所述同意。 – 2010-07-19 19:34:48

+0

hashing!=加密 – rook 2010-07-19 19:36:19