0

我一直在使用 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;
        }
    }
}

返回值表示成功、失败或禁止。每个用户都有一个存储在数据库中的唯一盐。

最初我从数据库中获取盐,在 PHP 中将用户输入的密码和数据库中的盐结合起来,然后用组合值再次查询数据库。我认为这会加快速度,因为只需要一次访问数据库并且代码更少。我还认为它同样安全,但是在阅读了对这个问题的最高回复后, 用 PHP 和 MySQL 腌制我的哈希......

首先,您的 DBMS (MySQL) 不需要任何对加密哈希的支持。您可以在 PHP 端完成所有这些工作,这也是您应该做的。

...我开始怀疑是否存在我没​​有发现的安全问题。

这段代码实际上有什么问题吗?

4

1 回答 1

2

本身没有任何问题。请记住,任何携带未加密/未散列密码的流量都是可疑的。因此,例如,当服务器是远程服务器,并且在与该服务器通信时未使用加密,则又是尝试拦截密码的时刻。此外,如果查询记录在某处(默认情况下,或者因为它们很慢),那么您有一个纯密码+您正在使用的盐坐在这些服务器日志中,毕竟您遇到了不存储纯文本密码的所有麻烦某处。如果您在自己的代码中私下执行此操作,则不会发生这种情况。

这一切都取决于你喜欢有多偏执。有更容易滥用和经常被遗忘的邪恶,比如会话固定。

于 2010-07-19T19:31:41.127 回答