返回列表 发帖
查看: 488|回复: 3

[求助] discuz由3.4升级到3.5 注册总是提示用户名包含敏感字符

2

主题

4

回帖

13

积分

初学乍练

贡献
0 点
金币
6 个
产品版本
X3.4
发表于 2025-10-2 22:01:16 | 查看全部 |阅读模式
如题,将论坛从3.4升级到3.5utf8版本后,现在注册填入任何用户名都提示 用户名包含敏感字符。uc通信正常
我知道答案 回答被采纳将会获得1 贡献 已有3人回答
回复

使用道具 举报

2

主题

4

回帖

13

积分

初学乍练

贡献
0 点
金币
6 个
产品版本
X3.4
 楼主| 发表于 2025-10-5 16:46:48 | 查看全部
经过对页面分析,应该是uc_client和uc_server下model的user模块中关于用户名判定check_username的代码有点兼容问题。
源代码如下:
  1. function check_username($username) {
  2.                 $charset = strtolower(UC_CHARSET);
  3.                 if ($charset === 'utf-8') {
  4.                         $guestexp = '\xE3\x80\x80|\xE6\xB8\xB8\xE5\xAE\xA2|\xE9\x81\x8A\xE5\xAE\xA2';
  5.                 } elseif ($charset === 'gbk') {
  6.                         $guestexp = '\xA1\xA1|\xD3\xCE\xBF\xCD';
  7.                 } elseif ($charset === 'big5') {
  8.                         $guestexp = '\xA1\x40|\xB9\x43\xAB\xC8';
  9.                 } else {
  10.                         return FALSE;
  11.                 }
  12.                 $guestexp .= '|^Guest';

  13.                 $len = $this->dstrlen($username);
  14.                 if($len > 15 || $len < 3 || preg_match("/\s+|^c:\\con\\con|[%,\*"\s\<\>\&\(\)']|$guestexp/is", $username)) {
  15.                         return FALSE;
  16.                 } else {
  17.                         return TRUE;
  18.                 }
  19.         }
复制代码
应该是对游客(简写繁写)、guest、以及特殊字符进行判断,看是否有敏感的。既然代码兼容问题,考虑utf8一个汉字占3个字符,给做了修改
  1. function check_username($username) {
  2.     // 1. 长度检查
  3.     $len = $this->dstrlen($username);
  4.     if($len > 21 || $len < 3) {
  5.         return FALSE; // 长度不符合要求
  6.     }
  7.    
  8.     // 2. 游客关键词检查(直接字符串匹配,更可靠)
  9.     $charset = strtolower(UC_CHARSET);
  10.     $isGuest = false;
  11.    
  12.     // 检查简繁体"游客"
  13.     if (strpos($username, '游客') !== false || strpos($username, '遊客') !== false) {
  14.         $isGuest = true;
  15.     }
  16.    
  17.     // 检查全角空格(不同编码)
  18.     if ($charset === 'utf-8' && strpos($username, ' ') !== false) { // UTF-8全角空格
  19.         $isGuest = true;
  20.     } elseif ($charset === 'gbk' && strpos($username, chr(0xA1).chr(0xA1)) !== false) { // GBK全角空格
  21.         $isGuest = true;
  22.     } elseif ($charset === 'big5' && strpos($username, chr(0xA1).chr(0x40)) !== false) { // Big5全角空格
  23.         $isGuest = true;
  24.     }
  25.    
  26.     // 检查Guest开头(不区分大小写)
  27.     if (stripos($username, 'Guest') === 0) {
  28.         $isGuest = true;
  29.     }
  30.    
  31.     if ($isGuest) {
  32.         return FALSE; // 包含游客相关内容
  33.     }
  34.    
  35.     // 3. 特殊字符检查
  36.     $specialChars = ['%', ',', '*', '"', '<', '>', '&', '(', ')', "'", ' ', "\t", "\r", "\n"];
  37.     foreach ($specialChars as $char) {
  38.         if (strpos($username, $char) !== false) {
  39.             return FALSE; // 包含特殊字符
  40.         }
  41.     }
  42.    
  43.     // 4. 检查系统特殊名称
  44.     if (strtolower($username) === 'c:\\\\con\\\\con') {
  45.         return FALSE;
  46.     }
  47.    
  48.     // 所有检查通过
  49.     return TRUE;
  50. }
复制代码
测试通过。
当然,因为对长度进行了扩充,所以数据库中member相应的两个表中,要对username的字段长度将15变成21
回复

使用道具 举报

15

主题

3497

回帖

5962

积分

应用开发者

贡献
415 点
金币
172 个
QQ
发表于 2025-10-3 07:17:08 | 查看全部
这个 只能具体检查一下看看了;

能接受有偿处理的话 可以加我 QQ
回复

使用道具 举报

6

主题

1405

回帖

1896

积分

应用开发者

贡献
40 点
金币
184 个
QQ
发表于 2025-10-3 12:19:52 | 查看全部
如果这个情况,只能根据提示用户名包含敏感字符的单独的修改了。
回复

使用道具 举报

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

本版积分规则

  • 关注公众号
  • 有偿服务微信
  • 有偿服务QQ

手机版|小黑屋|Discuz! 官方交流社区 ( 皖ICP备16010102号 |皖公网安备34010302002376号 )|网站地图|star

GMT+8, 2025-12-11 00:36 , Processed in 0.054158 second(s), 14 queries , Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
有偿服务QQ
有偿服务微信
返回顶部
快速回复 返回顶部 返回列表