请选择 进入手机版 | 继续访问电脑版

技能趴

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 250|回复: 0

[Discuz二次开发资料] Discuz注册页面的邮箱验证的相关的二次开发

[复制链接]

107

主题

273

帖子

4

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4
发表于 2018-10-18 11:00:23 | 显示全部楼层 |阅读模式
最近接到一个客户的需求,说发现注册页面的邮箱验证存在一个bug,用户使用gmail邮箱注册时,前缀可以通过任意地方加“.”号绕过系统的邮箱重复检测,用一个邮箱不断注册多个账号。也就是说:填写正确的gmail如下图

和填写经过混淆的gmail如下图


Discuz虽然判断为不同的邮箱,但是其不带点号的邮箱仍然能够正常接收验证邮件。


这个bug第一次听说,感到有点不可思议,但是既然客户有此需求,于是决定研究一下:

首先搞清楚Discuz邮箱验证过程和相关代码,搜索了一些相关资料:
游客,如果您要查看本帖隐藏内容请回复


根据参考资料,找到./uc_client/model/user.php和./uc_client/control/user.php,

原来代码中带有点号前缀的邮箱,为合法邮箱
所以首先需要修改代码判定前缀带有点号的邮箱为无效地址:
修改方法:./uc_client/model/user.php中增加一个函数:“check_emailformat_dot($email)”函数不变:
  1. function check_emailformat_dot($email) {
  2.                 $arr1=explode('@',$email);
  3.                 $arr2=explode('.',$arr1[0]);
  4.                 if(sizeof($arr2)>=2){
  5.                         return 1;
  6.                 }else{
  7.                         return 0;
  8.                 }
  9.         }
复制代码
次函数判断输入是否含有“.”号,如果含有则返回1,否则返回0
修改./uc_client/control/user.php 开头添加常量定义:
  1. define('UC_USER_EMAIL_INCLUDE_DOT', -7);
复制代码
大约258行处的函数修改成以下代码:
  1. function _check_email($email, $username = '') {
  2.                 if(empty($this->settings)) {
  3.                         $this->settings = $this->cache('settings');
  4.                 }
  5.                 if(!$_ENV['user']->check_emailformat($email)) {
  6.                         return UC_USER_EMAIL_FORMAT_ILLEGAL;
  7.                 }elseif($_ENV['user']->check_emailformat_dot($email)){
  8.                         return UC_USER_EMAIL_INCLUDE_DOT;
  9.                 }elseif(!$_ENV['user']->check_emailaccess($email)) {
  10.                         return UC_USER_EMAIL_ACCESS_ILLEGAL;
  11.                 } elseif(!$this->settings['doublee'] && $_ENV['user']->check_emailexists($email, $username)) {
  12.                         return UC_USER_EMAIL_EXISTS;
  13.                 } else {
  14.                         return 1;
  15.                 }
  16.         }
复制代码

如此以来,含有点号时,将返回一个常量-7,那么怎么在前端接收这个常量-7,并且输出相应的提示呢?
没找到参考资料,只好自行想办法。

通过查看代码,发现./source/class/class_member.php和./source/function/function_member.php中均含有疑似根据返回常量输出提示的代码:
没必要再去细看,直接分别改着试一下,发现后者修改有效:
于是将./source/function/function_member.php中的原函数checkemail($email)改成一下代码:
  1. function checkemail($email) {
  2.         global $_G;

  3.         $email = strtolower(trim($email));
  4.         if(strlen($email) > 32) {
  5.                 showmessage('profile_email_illegal', '', array(), array('handle' => false));
  6.         }
  7.         if($_G['setting']['regmaildomain']) {
  8.                 $maildomainexp = '/('.str_replace("\r\n", '|', preg_quote(trim($_G['setting']['maildomainlist']), '/')).')$/i';
  9.                 if($_G['setting']['regmaildomain'] == 1 && !preg_match($maildomainexp, $email)) {
  10.                         showmessage('profile_email_domain_illegal', '', array(), array('handle' => false));
  11.                 } elseif($_G['setting']['regmaildomain'] == 2 && preg_match($maildomainexp, $email)) {
  12.                         showmessage('profile_email_domain_illegal', '', array(), array('handle' => false));
  13.                 }
  14.         }

  15.         loaducenter();
  16.         $ucresult = uc_user_checkemail($email);

  17.         if($ucresult == -4) {
  18.                 showmessage('profile_email_illegal', '', array(), array('handle' => false));
  19.         } elseif($ucresult == -5) {
  20.                 showmessage('profile_email_domain_illegal', '', array(), array('handle' => false));
  21.         } elseif($ucresult == -6) {
  22.                 showmessage('profile_email_duplicate', '', array(), array('handle' => false));
  23.         }elseif($ucresult == -7) {
  24.                 showmessage('邮箱账号禁用“.”号', '', array(), array('handle' => false));
  25.         }
  26. }
复制代码
也就是添加了后面$ucresult == -7的情况


就此修改完成,当然上面的提示带有中文,可能出现乱码,可以将其定义到语言包文件里,适应不同discuz不同的编码

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|技能趴

GMT+8, 2018-12-17 13:45 , Processed in 0.071210 second(s), 32 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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