discuzX的注册和登录都是很安全的,但是我们其实也可以自己设置对于密码的计算方法。现对于其实现原理进行简单说明,
首先,在discuzX上登录提交的是
- member.php?mod=logging&action=login&loginsubmit=yes&frommessage&loginhash=Lxb8h
复制代码
这样一个表单。
mod是代表模块,对于mod=logging这个调用的是
- source/module/member/member_logging.php
复制代码
通过层层剥离调用,登录具体验证实现是通过
- uc_client\control\user.php
复制代码
中的onlogin()函数
具体代码是
- 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);
- }
复制代码
如果我们想不要默认md5的判断进行登录校验修改
- 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'];
- }
复制代码
的判断即可
|