由于搭建了一个SS是依附在另外的一个员工网站下的,03+sql2000。
为了避免过多的账户,上头要求登录验证还是验证原来的账号密码。
可是密码的加密方式完全不一样。于是我将SS的验证绕了出来——把SS用户数据库里的密码置空或者设定了一个固定值。
然后在原来网站上写了一个WEB SERVICE,如果验证成功,就把SS里接受的密码设置成那个固定值。具体代码如下:- $password = $_POST['password'];
- $username = $_POST['username'];
- /*$query = "http://www.xxxx.com/xxxx?name=".$username."&pwd=".$password;
- //Outside Login
- //Create the DOM Document object from the XML returned by the query
- $xml = file_get_contents($query);
- $dom = new DOMDocument;
- $dom = DOMDocument::loadXML($xml);
- $state = $dom->getElementsByTagName('STATE');
- if($state->item(0)->nodeValue==1) $password="abc";
- else $password ="";*/
-
- dbconnect(1);
- if(empty($_SCONFIG['ucmode'])) {
- $password = md5($password);
- $query = $_SGLOBAL['db_bbs']->query('SELECT * FROM '.tname('members', 1).' WHERE username=\''.$username.'\' AND password=\''.$password.'\'');
- } else {
- $ucresult = uc_user_login($username, $password, $loginfield == 'uid');
- list($members['uid'], $members['username'], $members['password'], $members['email']) = saddslashes($ucresult);
- if($members['uid'] > 0) {
- $query = $_SGLOBAL['db_bbs']->query('SELECT * FROM '.tname('members', 1).' WHERE uid=\''.$members['uid'].'\'');
- } else {
- messagebox('error', 'login_error', geturl('action/login'));
- }
- }
- if($member = $_SGLOBAL['db_bbs']->fetch_array($query)) {
- if(empty($_SCONFIG['noseccode']) || empty($_SCONFIG['ucmode']) && $member['secques']) {
- $title = $blang['safety_questions'];
- $guidearr = array();
- include template('site_secques');
- exit;
- } else {
- $msg = 'login_succeed';
- if(!empty($_SCONFIG['ucmode'])) {
- $msg = $lang['login_succeed'].uc_user_synlogin($member['uid']);
- }
- dologin($member, $cookietime, $msg);
- exit;
- }
- }
复制代码 然后我将数据库里的用户密码都设置为了定值“abc”SS加密方式(论坛的members表以及SS的members表)。
但是在密码改为“abc”后,不用我新增的验证方式也无法通过验证(我把自己新增的验证注释掉了,仅用原来SS本身的验证)。只有管理员账户用初始密码可以进,别的后来导入的账户都无法用“abc”登陆。这是什么原因?是不是验证的数据库表不是members?还是它的验证机制有别的玄机?
据推断问题大致出现在这一句:
$ucresult = uc_user_login($username, $password, $loginfield == 'uid');
list($members['uid'], $members['username'], $members['password'], $members['email']) = saddslashes($ucresult);
if($members['uid'] > 0) {
$query = $_SGLOBAL['db_bbs']->query('SELECT * FROM '.tname('members', 1).' WHERE uid=\''.$members['uid'].'\'');
} else {
messagebox('error', 'login_error', geturl('action/login'));
}
我一直没有弄懂uc_user_login()这个函数的机制(我在函数的声明处看了,依然没有弄懂)望请高手指点。 |