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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

关于注册的Email验证分析

[复制链接]
dongdong0925 发表于 2011-8-28 20:59:18 | 显示全部楼层 |阅读模式
开启新用户注册的Email验证:
进入站点后台->全局->注册与访问下,找到新用户注册验证,选择Email验证方式。

向用户发送验证邮件分析:
找到source\class\class_member.php文件,在362行附近
  1. $groupinfo = array();
  2. if($this->setting['regverify']) {
  3.         $groupinfo['groupid'] = 8;
  4. } else {
  5.         $groupinfo['groupid'] = $this->setting['newusergroupid'];
  6. }
复制代码
此段代码为如果开启了新用户注册验证的话,那么注册后用户的用户组为待验证用户组(groupid=8),否则为新手用户组。

在782行附近
  1. switch($this->setting['regverify']) {
  2.         case 1:
  3.                 $idstring = random(6);
  4.                 $authstr = $this->setting['regverify'] == 1 ? "$_G[timestamp]\t2\t$idstring" : '';
  5.                 DB::query("UPDATE ".DB::table('common_member_field_forum')." SET authstr='$authstr' WHERE uid='$_G[uid]'");
  6.                 $verifyurl = "{$_G[siteurl]}member.php?mod=activate&uid={$_G[uid]}&id=$idstring";
  7.                 $email_verify_message = lang('email', 'email_verify_message', array(
  8.                         'username' => $_G['member']['username'],
  9.                         'bbname' => $this->setting['bbname'],
  10.                         'siteurl' => $_G['siteurl'],
  11.                         'url' => $verifyurl
  12.                 ));
  13.                 sendmail("$username <$email>", lang('email', 'email_verify_subject'), $email_verify_message);
  14.                 $message = 'register_email_verify';
  15.                 $locationmessage = 'register_email_verify_location';
  16.                 $url_forward = dreferer();
  17.                 break;
复制代码
case:1为Email验证方式。
$idstring为随机生成的6位字符串。
$authstr为根据规则生成的对应该用户的验证串。
$verifyurl为生成的该用户的验证url链接。
  1. sendmail("$username <$email>", lang('email', 'email_verify_subject'), $email_verify_message);
复制代码
向该用户发送验证邮件(邮件内容包含验证链接)。


用户点击邮件里的链接进行验证分析:
找到source\module\member\member_activate.php文件
  1. $query = DB::query("SELECT m.uid, m.username, m.credits, mf.authstr FROM ".DB::table('common_member')." m, ".DB::table('common_member_field_forum')." mf
  2.                 WHERE m.uid='$_G[gp_uid]' AND mf.uid=m.uid AND m.groupid='8'");

  3.         $member = DB::fetch($query);
  4.         list($dateline, $operation, $idstring) = explode("\t", $member['authstr']);
复制代码
从数据库里查询对应这个用户的验证串(authstr)。
  1. if($operation == 2 && $idstring == $_G['gp_id']) {
  2.                 $query = DB::query("SELECT groupid FROM ".DB::table('common_usergroup')." WHERE type='member' AND '$member[credits]'>=creditshigher AND '$member[credits]'<creditslower LIMIT 1");
  3.                 DB::query("UPDATE ".DB::table('common_member')." SET groupid='".DB::result($query, 0)."', emailstatus='1' WHERE uid='$member[uid]'");
  4.                 DB::query("UPDATE ".DB::table('common_member_field_forum')." SET authstr='' WHERE uid='$member[uid]'");
  5.                 showmessage('activate_succeed', 'index.php', array('username' => $member['username']));
  6.         } else {
  7.                 showmessage('activate_illegal', 'index.php');
  8.         }
复制代码
如果$operation == 2,同时通过数据库里查询出来的随机串($idstring)和传参过来的id($_G['gp_id'])一致:
  1. $query = DB::query("SELECT groupid FROM ".DB::table('common_usergroup')." WHERE type='member' AND '$member[credits]'>=creditshigher AND '$member[credits]'<creditslower LIMIT 1");
复制代码
根据积分查询此用户的用户组。
  1. DB::query("UPDATE ".DB::table('common_member')." SET groupid='".DB::result($query, 0)."', emailstatus='1' WHERE uid='$member[uid]'");
复制代码
更新用户表(common_member)中此用户的用户组(groupid)和Email验证状态(emailstatus)。
  1. showmessage('activate_succeed', 'index.php', array('username' => $member['username']));
复制代码
提示验证成功,否则提示验证失败。
  1. showmessage('activate_illegal', 'index.php');
复制代码
平(⊙o⊙)凡 发表于 2011-8-30 19:12:49 | 显示全部楼层
不错,学校啦。
回复

使用道具 举报

wukunda 发表于 2011-9-24 11:19:08 | 显示全部楼层
好贴,有个问题请教:我想改变邮件里边的文字内容,怎么改?
求助!
https://discuz.dismall.com/thread-2392094-1-1.html
回复

使用道具 举报

ybs885 发表于 2011-9-24 18:45:16 | 显示全部楼层
看不懂啊。。。我汗
回复

使用道具 举报

无效楼层,该帖已经被删除
meng_philip 发表于 2011-10-20 17:26:15 | 显示全部楼层
逻辑挺复杂的 不过还是挺棒的 {:soso_e182:}
回复

使用道具 举报

ycsd0258 发表于 2011-11-3 23:13:33 | 显示全部楼层
搞不懂怎么设置啊!!!
回复

使用道具 举报

ycsd0258 发表于 2011-11-3 23:14:29 | 显示全部楼层
要有全部详细设置步骤教材就好了!!!
www.szybss.com/bbs
回复

使用道具 举报

FenToo 发表于 2011-11-18 09:26:05 | 显示全部楼层
突然发觉,很喜欢dongdong老大的东西,最近一直在看dz源码,不过由于缺少注释信息。感觉挺吃力的,就只能来寻找dongdong老大的备注文件咯
回复

使用道具 举报

unpass 发表于 2011-12-17 01:49:29 | 显示全部楼层
应该是php吧
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 13:37 , Processed in 0.028454 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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