关于DZ7.0密码加密方式以及登录验证

今天下午5点的时候将电脑搬到了点击工作室。

上次做那个留言版,主要的是要求以DZ数据库的成员表进行登录验证,这是最麻烦的一点,上次写的那个与DZ的整合,谈谈 说有问题,我一看,嘿,还真有问题,主要是验证通不过,那就是与DZ的整合问题了。我查了一些资料,最后找到了原因。

从DZ6.0开始,会员的帐号密码等等信息都是存放在UC数据库中的,而discuz数据库members表中的password数据拿来没什么用,估计是为了兼容以前旧的程序的查询而没有删除的吧。

$password = md5(random(10));
复制代码将一个乱数转成md5, 然后下一行就是执行写入SQL. 强悍吧, 论坛数据表中的密码md5,其实是假象.一点作用都没有.

并且关于UC数据库中PASSWORD的形成是md5(md5(‘password’),alt),就是说经过了两次md5加密,第一次直接将密码加密,第二次加了一个随即字符串salt然后md5加密。并且这个随即的字符串salt是保存在uc_members表中的。于是我的验证是这么的:

 
            $dz_db_obj=new DB($config[‘discuz’][‘hostname’],$config[‘discuz’][‘username’],$config[‘discuz’][‘password’]);
            $dz_db_obj->select_db($config[‘discuz’][‘database’],’gbk’);
            $dz_db_obj->die_error=true;

            $name=iconv(‘utf-8′,’gbk’,deal_chars($_POST[‘name’]));
            $password=deal_chars($_POST[‘password’]);
           
            $sql_result=$dz_db_obj->query("SELECT count(1) FROM uc_members WHERE username=’$name’ and password=md5(concat(md5(‘$password’),salt))");
            $row=$dz_db_obj->fetch_assoc($sql_result);

            if($row)
            {
                $row[‘username’]=$_POST[‘name’];
                $_SESSION[‘user’]=$row;

                //设置用户COOKIE信息
                {
                    //DZ里面的用户数据
                    setcookie(‘user_name’,$_SESSION[‘user’][‘username’],time()+60*60*24*356,’/’);
                }
               
                head_show(‘reload’,"欢迎回来 <span style=’color:red;’>{$row[‘username’]}</span> ~~");
            }
            else
            {
                head_show(‘error’,’用户名或密码不正确~~’);
            }