最近对一个地方门户的论坛,从Discuz!NT2.5转换到Discuz!PHP 7.0 ,由于论坛原来是从DVBBS(Asp) 转换到Discuz!NT的,所以仍然遗留了Asp时代的16位MD5密码问题,由于论坛比较小型,所以采用一种比较简单的解决方式:
1,修改Discuz!PHP 7.0论坛的logging.php文件。
如果没有修改源代码的话,在87行代码,即:
$ucresult = uc_user_login($username, $password, $loginfield == 'uid', 1, $questionid, $answer);
前面,加入如下的代码:
//对16位密码进行处理 == Start
$query = $db->query("select uid,username,password,email from {$tablepre}members where username='{$username}'") ;
if ($tempmember = $db->fetch_array($query))
{
if (strlen(trim($tempmember['password'])) == 16 && substr(md5($password),8,16) == trim($tempmember['password'])) //对ASP下的16位密码进行修正
{
uc_user_edit($username,$password,$password,$tempmember['email'],1);
$db->query("update {$tablepre}members set password='".md5($password)."' where username='{$username}'");
}
}
//对16位密码进行处理 == End
2,如果安装了UCenter Home,还需要修改Ucenter Home 1.5的source/do_login.php文件
如果没有修改源代码的话,在69行代码,即:
if(!$passport = getpassport($username, $password)) {
前面,加入如下代码:
//处理动网16位密码 ==Start
//直接连接BBS数据库,获取用户密码,判断是否是16位密码
$bbsdbname = "discuz" ;
$bbsdblink = mysql_connect($_SC['dbhost'],$_SC['dbuser'],$_SC['dbpw']);
mysql_query("SET character_set_connection=".$_SC['dbcharset'].",character_set_results=".$_SC['dbcharset'].",character_set_client=binary",$bbsdblink) ;
mysql_select_db($bbsdbname,$bbsdblink) ;
$bbsquery = mysql_query("select uid,username,password,email from cdb_members where username='{$username}'",$bbsdblink);
if ($bbsuser = mysql_fetch_array($bbsquery))
{
if (strlen(trim($bbsuser['password'])) == 16 && substr(md5($password),8,16) == trim($bbsuser['password'])) //对ASP下的16位密码进行修正
{
uc_user_edit($username,$password,$password,$bbsuser['email'],1);
mysql_query("update cdb_members set password='".md5($password)."' where username='{$username}'",$bbsdblink);
}
}
mysql_select_db($_SC['dbname'],$bbsdblink) ;
mysql_close($bbsdblink);
//处理动网16位密码 ==End
不过这样的解决方式耦合性比较强,要求论坛和UCH的账号,密码是一样的。