Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[经验] 转-UCHOME2.0登录验证机制分析

[复制链接]
linuxxu 发表于 2009-11-3 22:22:40 | 显示全部楼层 |阅读模式
UCHOME2.0登录验证机制分析
蜗牛
Uchome2.0采用cookie+数据库的方式来进行用户登录验证的
1 登录
A:用户填好登录表单之后数据被提交给source\do_login.php 处理
B:在do_login.php中下面这些语句接收传递来的用户名密码与cookie生效时间
  1. $password = $_POST['password']; $username = trim($_POST['username']); $cookietime = intval($_POST['cookietime']);
复制代码
C:然后验证用户提交来的用户名以及密码的正确性,不正确则跳转并提示登录失败
  1. //同步获取用户源if(!$passport = getpassport($username,$password)){ showmessage('login_failure_please_re_login','do.php?ac='.$_SCONFIG['login_action']); }
复制代码
注意:这里验证用户名与密码的正确性是通过uc_client在Ucenter用户中心数据库中查询的
D:若验证通过之后,再将获取到得用户账户信息赋给setarr变量数组
  1. $setarr = array( 'uid' => $passport['uid'], 'username' => addslashes($passport['username']), 'password' => md5("$passport[uid] | $_SGLOBAL[timestamp]")//本地密码随机生成);
复制代码
E:查询uchome的数据库看该用户信息是否存在于Uchome数据库中,不存在的话,则将从Ucenter中查询到的用户数据写入到uchome的member表中,存在则将member中的密码替换掉从Ucenter中查询出来的密码,存入setarr变量数组中。
  1. $query = $_SGLOBAL['db']->query("SELECT password FROM".tname('member')."WHERE uid = '$setarr[uid]'"); if($value = $_SGLOBAL['db'] -> fetch_array($Jquery)){ $setarr['password'] = addslashes($value['password']);
复制代码
  1. }else{ //更新本地用户库inserttable('member',$setarr,0,true); }
复制代码
F:将用户登录信息写入到Uchome的session表中

Insertsession函数在source\function_space.php中定义
其主要功能为:
a) 清除session表中的某个用户的记录
b) 获得用户的IP以及是否使用隐身道具
c) 将setarr变量数组中的数据插入到session表中。
d) 更新统计数数据等
G:将用户名与密码加密写入cookie中
  1. ssetcookie('auth',authcode("$setarr[password]\t$setarr[uid]",'ENCODE'),$cookietime); ssetcookie('loginuser',$passport['username'],31536000);
复制代码
2 验证
判断当前用户登录状态是通过source\function_common.php中的checkauth函数实现的,下面就来分析这个函数
A:判断$_cookie[auth]是否存在,若不存在则不进行任何处理,并清除所有cookie

注意:这里说的密码以及上面说的将密码加密进cookie中的密码并不是用户的真实密码,而是经过md5双重加密并且salt处理后的密码
C:从session数据表中取出用户ID为$_SGLOBAL[supe_uid]的用户信息,若该记录存在则执行下面的操作,否则执行D操作(直接查询用户数据库)

如果取出来的密码与cookie中的密码相等,那么判定为登录成功将数据写入到

否则判定为登录失败,清除所有cookie
D:在C步时,若在session表中没有该用户的数据则,在用户数据表member中查询该ID得用户数据,看cookie中的密码是否与数据库中的密码一样,如果一样则登录成功,并将用户数据写入到session表中保持用户的登录状态,否则登录失败

上面无论是用session表来判定登录状态还是用member表来判定登录状态,都会影响到一个变量,那就是$_SGLOBAL['supe_uid'],在程序处理的时候,用户登录与否一般要用到得变量就是$_SGLOBAL['supe_uid']。
例如在space.php文件中有个这样的语句

这个函数就是看$_SGLOBAL['supe_uid']是否存在,存在的话就以这个ID的身份去操作,不存在就说明用户登录不成功需要用户登录才能操作。

这是我的网站:www.nba114.com

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

评分

1

查看全部评分

yawei74 发表于 2009-11-4 01:56:12 | 显示全部楼层
ding lou zhu
回复

使用道具 举报

 楼主| linuxxu 发表于 2009-11-4 07:01:47 | 显示全部楼层
自己顶下,不能沉了
回复

使用道具 举报

 楼主| linuxxu 发表于 2009-11-4 13:45:33 | 显示全部楼层
需要的看看吧  很有用的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-23 05:46 , Processed in 0.027545 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表