热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ucentermysql账号_Ucenter的用户注册和登录分析

因为排查一个问题,顺带着熟悉了一下Discuz!与Ucenter注册和登录的机制,特整理分析。下面以Discuz!X2.5为例分析代码实现。1.注册找到

因为排查一个问题,顺带着熟悉了一下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[&#39;user&#39;]->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= &#39;&#39;, $answer = &#39;&#39;, $regip = &#39;&#39;) {

$regip = empty($regip) ? $this->base->onlineip : $regip;

$salt = substr(uniqid(rand()), -6);

$password = md5(md5($password).$salt);

$sqladd = $uid ? "uid=&#39;".intval($uid)."&#39;," : &#39;&#39;;

$sqladd .= $questionid > 0 ? " secques=&#39;".$this->quescrypt($questionid, $answer)."&#39;," : " secques=&#39;&#39;,";

$this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username=&#39;$username&#39;, password=&#39;$password&#39;, email=&#39;$email&#39;, regip=&#39;$regip&#39;, regdate=&#39;".$this->base->time."&#39;, salt=&#39;$salt&#39;");

$uid = $this->db->insert_id();

$this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid=&#39;$uid&#39;");

return $uid;

}

这里会将用户信息写入Ucenter的用户表中。

在这里可以看到用户密码不是用明文存储的,加密的格式为:md5(md5(用户密码) . 6位随机串)

2.登录

找到source\class\class_member.php文件,有如下代码:$result = userlogin($_GET[&#39;username&#39;], $_GET[&#39;password&#39;], $_GET[&#39;questionid&#39;], $_GET[&#39;answer&#39;], $this->setting[&#39;autoidselect&#39;] ? &#39;auto&#39; : $_GET[&#39;loginfield&#39;], $_G[&#39;clientip&#39;]);

userlogin定义在source\function\function_member.php文件,函数内部有如下代码:if($isuid == 3) {

if(!strcmp(dintval($username), $username)) {

$return[&#39;ucresult&#39;] = uc_user_login($username, $password, 1, 1, $questionid, $answer, $ip);

} elseif(isemail($username)) {

$return[&#39;ucresult&#39;] = uc_user_login($username, $password, 2, 1, $questionid, $answer, $ip);

}

if($return[&#39;ucresult&#39;][0] <= 0 && $return[&#39;ucresult&#39;][0] != -3) {

$return[&#39;ucresult&#39;] = uc_user_login(addslashes($username), $password, 0, 1, $questionid, $answer, $ip);

}

} else {

$return[&#39;ucresult&#39;] = 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= &#39;&#39;, $answer = &#39;&#39;) {

$isuid = intval($isuid);

$return = call_user_func(UC_API_FUNC, &#39;user&#39;, &#39;login&#39;, array(&#39;username&#39;=>$username, &#39;password&#39;=>$password, &#39;isuid&#39;=>$isuid, &#39;checkques&#39;=>$checkques, &#39;questionid&#39;=>$questionid, &#39;answer&#39;=>$answer));

return UC_COnNECT== &#39;mysql&#39; ? $return : uc_unserialize($return);

}

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

$this->init_input();

$isuid = $this->input(&#39;isuid&#39;);

$username = $this->input(&#39;username&#39;);

$password = $this->input(&#39;password&#39;);

$checkques = $this->input(&#39;checkques&#39;);

$questiOnid= $this->input(&#39;questionid&#39;);

$answer = $this->input(&#39;answer&#39;);

if($isuid == 1) {

$user = $_ENV[&#39;user&#39;]->get_user_by_uid($username);

} elseif($isuid == 2) {

$user = $_ENV[&#39;user&#39;]->get_user_by_email($username);

} else {

$user = $_ENV[&#39;user&#39;]->get_user_by_username($username);

}

$passwordmd5 = preg_match(&#39;/^\w{32}$/&#39;, $password) ? $password : md5($password);

if(empty($user)) {

$status = -1;

} elseif($user[&#39;password&#39;] != md5($passwordmd5.$user[&#39;salt&#39;])) {

$status = -2;

} elseif($checkques && $user[&#39;secques&#39;] != &#39;&#39; && $user[&#39;secques&#39;] != $_ENV[&#39;user&#39;]->quescrypt($questionid, $answer)) {

$status = -3;

} else {

$status = $user[&#39;uid&#39;];

}

$merge = $status != -1 && !$isuid && $_ENV[&#39;user&#39;]->check_mergeuser($username) ? 1 : 0;

return array($status, $user[&#39;username&#39;], $password, $user[&#39;email&#39;], $merge);

}

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

验证的格式为:首先会验证用户密码是否为32位,如果不是则对用户输出的密码进行md5处理。(32位验证是后台设置的加密传输密码,开启后会先进行md5然后才传递给Ucenter)

Ucenter里存储的对应用户的加密后的密码 == md5(格式化后的用户输入的密码 . Ucenter里存储的对应用户的6位随机串)



推荐阅读
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
author-avatar
GRcoder
弱者,为何而战!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有