因为排查一个问题,顺带着熟悉了一下Discuz!与Ucenter注册和登录的机制,特整理分析。

下面以Discuz! X2.5为例分析代码实现。

1.注册

找到source\class\class_member.php文件,有如下代码:

$uid = uc_user_register(addslashes($username), $password, $email, $questionid, $answer, $_G['clientip']);

uc_user_register定义在uc_client\client.php文件,代码如下:

function uc_user_register($username, $password, $email, $questionid = '', $answer = '', $regip = '') {return call_user_func(UC_API_FUNC, 'user', 'register', array('username'=>$username, 'password'=>$password, 'email'=>$email, 'questionid'=>$questionid, 'answer'=>$answer, 'regip' => $regip));
}

此函数会回调uc_server下的方法,执行文件为uc_server\control\user.php,执行代码如下:

function onregister() {$this->init_input();$username = $this->input('username');$password =  $this->input('password');$email = $this->input('email');$questionid = $this->input('questionid');$answer = $this->input('answer');$regip = $this->input('regip');if(($status = $this->_check_username($username)) < 0) {return $status;}if(($status = $this->_check_email($email)) < 0) {return $status;}$uid = $_ENV['user']->add_user($username, $password, $email, 0, $questionid, $answer, $regip);return $uid;
}

add_user定义在uc_server\model\user.php文件,代码如下:

function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') {$regip = empty($regip) ? $this->base->onlineip : $regip;$salt = substr(uniqid(rand()), -6);$password = md5(md5($password).$salt);$sqladd = $uid ? "uid='".intval($uid)."'," : '';$sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid, $answer)."'," : " secques='',";$this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'");$uid = $this->db->insert_id();$this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'");return $uid;
}

这里会将用户信息写入Ucenter的用户表中。
在这里可以看到用户密码不是用明文存储的,加密的格式为:

md5(md5(用户密码) . 6位随机串)

2.登录

找到source\class\class_member.php文件,有如下代码:

$result = userlogin($_GET['username'], $_GET['password'], $_GET['questionid'], $_GET['answer'], $this->setting['autoidselect'] ? 'auto' : $_GET['loginfield'], $_G['clientip']);

userlogin定义在source\function\function_member.php文件,函数内部有如下代码:

if($isuid == 3) {if(!strcmp(dintval($username), $username)) {$return['ucresult'] = uc_user_login($username, $password, 1, 1, $questionid, $answer, $ip);} elseif(isemail($username)) {$return['ucresult'] = uc_user_login($username, $password, 2, 1, $questionid, $answer, $ip);}if($return['ucresult'][0] <= 0 && $return['ucresult'][0] != -3) {$return['ucresult'] = uc_user_login(addslashes($username), $password, 0, 1, $questionid, $answer, $ip);}
} else {$return['ucresult'] = uc_user_login(addslashes($username), $password, $isuid, 1, $questionid, $answer, $ip);
}

uc_user_login定义在uc_client\client.php文件,代码如下:

function uc_user_login($username, $password, $isuid = 0, $checkques = 0, $questionid = '', $answer = '') {$isuid = intval($isuid);$return = call_user_func(UC_API_FUNC, 'user', 'login', array('username'=>$username, 'password'=>$password, 'isuid'=>$isuid, 'checkques'=>$checkques, 'questionid'=>$questionid, 'answer'=>$answer));return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
}

此函数会回调uc_server下的方法,执行文件为uc_server\control\user.php,执行代码如下:

function onlogin() {$this->init_input();$isuid = $this->input('isuid');$username = $this->input('username');$password = $this->input('password');$checkques = $this->input('checkques');$questionid = $this->input('questionid');$answer = $this->input('answer');if($isuid == 1) {$user = $_ENV['user']->get_user_by_uid($username);} elseif($isuid == 2) {$user = $_ENV['user']->get_user_by_email($username);} else {$user = $_ENV['user']->get_user_by_username($username);}$passwordmd5 = preg_match('/^\w{32}$/', $password) ? $password : md5($password);if(empty($user)) {$status = -1;} elseif($user['password'] != md5($passwordmd5.$user['salt'])) {$status = -2;} elseif($checkques && $user['secques'] != '' && $user['secques'] != $_ENV['user']->quescrypt($questionid, $answer)) {$status = -3;} else {$status = $user['uid'];}$merge = $status != -1 && !$isuid && $_ENV['user']->check_mergeuser($username) ? 1 : 0;return array($status, $user['username'], $password, $user['email'], $merge);
}

这里会验证用户输入的密码是否和Ucenter里存储的密码一致。
验证的格式为:

首先会验证用户密码是否为32位,如果不是则对用户输出的密码进行md5处理。(32位验证是后台设置的加密传输密码,开启后会先进行md5然后才传递给Ucenter)
Ucenter里存储的对应用户的加密后的密码 == md5(格式化后的用户输入的密码 . Ucenter里存储的对应用户的6位随机串)

Ucenter的用户注册和登录分析相关推荐

  1. ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析

    ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析 . /   // datadase odbc1.cpp : 定义应用程序的入口点.  //   #inc ...

  2. django用户注销_Django中的用户注册,登录和注销指南

    django用户注销 This article will cover how to allow user registration, login, and logout functionality o ...

  3. 使用Forms Authentication实现用户注册、登录 (二)用户注册与登录

    从这一部分开始,我们将通过一个实际的完整示例来看一下如何实现用户注册与登录.在介绍注册与登录之前,我们首先介绍一下如何判断用户是否已登录,并未后面的示例编写一些基础代码. 判断用户是否已经登录 首先, ...

  4. 使用Forms Authentication实现用户注册、登录 (三)用户实体替换

    使用Forms Authentication实现用户注册.登录 (三)用户实体替换 收藏 IPrincipal和IIdentity 通过查阅文档,我们可以看到HttpContext.User属性的类型 ...

  5. python注销代码_django用户注册、登录、注销和用户扩展的示例

    用户部分是一个网站的基本功能,django对这部分进行了很好的封装,我们只需要在django的基础上做些简单的修改就可以达到我们想要的效果 首先我假设你对django的session.cookie和数 ...

  6. 使用Web API和React创建用户注册和登录

    目录 介绍 先决条件 代码 创建数据库和表 创建一个Web API项目 创建React项目 介绍 在本文中,我们将逐步学习使用Reactjs和Web API创建用户注册和登录页面的过程.React是一 ...

  7. Python+django网页设计入门(5):自定义用户注册与登录功能

    今天恰逢1024,是我们码农自己的节日,祝"Python小屋"所有朋友节日快乐!发几个去年整理的段子开心一下: 祝所有程序员1024节日快乐 =================== ...

  8. python连接数据库实现登录注册_python实现非数据库模式的用户注册和登录

    码农公社  210.net.cn  210= 1024  10月24日一个重要的节日--码农(程序员)节 python面向函数编程,模拟用户注册和登录. 由以下两个文件来实现: 1.user.txt文 ...

  9. android qq登录分析,[原创]对QQ手游授权登录的一点分析

    1.前言 最近无事玩王者,发现某些租号平台可以直接通过自身的APP打开腾讯的游戏进行登录,于是对这一登录过程做了简单的分析 2.QQ打开游戏的简单分析 发现不管是IOS还是Android都可以在QQ里 ...

最新文章

  1. [转]XPS转JPG转换器
  2. 陕西农心邮箱服务器,由农心杯决战看AI规则对胜负判断的差异
  3. AJPFX关于collection总结
  4. ubuntu 设置大小写切换隐藏_VirtualBox中ubuntu的LAMP项目(温度采集)
  5. linux compress参数,compress命令_Linux compress 命令用法详解:使用Lempress-Ziv编码压缩数据文件...
  6. CCommandLineInfo详解-启动不创建新文档【对单文档有问题?】
  7. Python实现随机生成10以内的加法
  8. Flutter实战一Flutter聊天应用(三)
  9. 不确定性管理,更需要领导力
  10. macbook/macos输入法乱跳
  11. 一年月份大小月口诀_农历大小月卦口诀详解(最新版).doc
  12. 放大器的压摆率对电路性能的影响-运放压摆率
  13. 揭秘TVS管在电压与电流中的奥秘
  14. stm32跑web服务器和协议栈的区别,STM32与LAN9252构建EtherCAT从站(二):使用SSC生成协议栈和XML文件——丁丁的个人网站...
  15. CDbCriteria CArrayDataProvider zii.widgets.grid (1)
  16. 苏州新导RFID化工厂人员定位系统中的应用,化工厂人员定位你get到了吗?
  17. R计算移动平均的方法
  18. 【抓包工具】实战:WireShark 捕获过滤器的超全使用教程
  19. 有N个台阶,可以走两步也可以走一步 一共有多少种走法
  20. Migrating from REDWOOD CRONACLE TO CA WORKLOAD AUTOMATION GUIDE

热门文章

  1. 推荐一个免费下matlab代码的网站
  2. C语言1.5e10什么意思,汽车排量1.5e是什么意思
  3. 滑雪(广搜+记忆数组+STL)
  4. jquery 模糊匹配
  5. JSON.stringify格式化Json字符串
  6. 证明线性空间子空间的基可以扩充为整个空间的基
  7. 【论文阅读】【综述】3D Object Detection 3D目标检测综述
  8. vue 列表展开收起
  9. springboot水产品销售系统的设计与实现毕业设计源码041700
  10. excel电子表格插件_电子表格的美好时光