从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','用户名或密码不正确~~');
} |