搜索
查看: 1997|回复: 0

[转载] Discuz 中「衡」和「欣」 无法注册「用户名包含敏感字符」

[复制链接]
  • TA的每日心情
    慵懒
    2017-10-13 23:57
  • 签到天数: 170 天

    [LV.7]常住居民III

    0

    贡献

    17

    积分

    36

    帖子

    管理员

    笨蛋索尼子

    Rank: 20Rank: 20Rank: 20Rank: 20

    主题
    24
    经验
    11288
    银币
    505
    注册时间
    2016-9-25
    发表于 2016-11-6 09:49:10 | 显示全部楼层 |阅读模式
    虚拟主机教程
    面板: 通用/无限制
    网页程序: Discuz! X以上
    操作系统: 通用/无限制
    Web服务器: 通用/无限制
    程序语言: 通用/无限制
    数据库: 通用/无限制
    加密系统: 通用/无限制
    在解释为什么Discuz会出现这个奇葩的BUG之前先将这个BUG解决掉好了。。

    在网站根目录中的 /uc_client/model/user.php/uc_server/model/user.php 文件中(第41-49行),找到:
    1.         function check_username($username) {
    2.                 $guestexp = '\xA1\xA1|\xAC\xA3|^Guest|^\xD3\xCE\xBF\xCD|\xB9\x43\xAB\xC8';
    3.                 $len = $this->dstrlen($username);
    4.                 if($len > 15 || $len < 3 || preg_match("/\s+|^c:\\con\\con|[%,\*\"\s\<\>\&]|$guestexp/is", $username)) {
    5.                         return FALSE;
    6.                 } else {
    7.                         return TRUE;
    8.                 }
    9.         }


    这个function里有这样一行过滤语句
    1.                 $guestexp = '\xA1\xA1|\xAC\xA3|^Guest|^\xD3\xCE\xBF\xCD|\xB9\x43\xAB\xC8';


    将里面的 \xA1\xA1|\xAC\xA3| 删除即可。(注意不要删掉左边的引号啥的

    改完以后应该是这样的
    1.         function check_username($username) {
    2.                 $guestexp = '^Guest|^\xD3\xCE\xBF\xCD|\xB9\x43\xAB\xC8';
    3.                 $len = $this->dstrlen($username);
    4.                 if($len > 15 || $len < 3 || preg_match("/\s+|^c:\\con\\con|[%,\*\"\s\<\>\&]|$guestexp/is", $username)) {
    5.                         return FALSE;
    6.                 } else {
    7.                         return TRUE;
    8.                 }
    9.         }


    教程到此就结束了0x0





    如果对背后的技术原因有兴趣的话欢迎继续往下看。。


    在UTF-8中,将「衡」这个汉字转换为16进制的话会是 \xE8\xA1\xA1,「欣」的话则是 \xE6\xAC\xA3
    刚才删掉的那个语句的功能是,匹配是否有字符包含 \xA1\xA1 或者 \xAC\xA3
    然后「衡」 \xE8\xA1\xA1 里面包含 \xA1\xA1 ,「欣」  \xE6\xAC\xA3 里面包含了 \xAC\xA3。于是就被拦截了. .


    GBK是每个字都使用2字节储存的。\xA1\xA1 是一个全角空格,第二个咱表示不知道是什么...
    然而UTF-8里中文字是使用3字节储存对的,所以其实翻翻字符表,很多字都会包含GBK那2个字节,于是被拦截的字不仅仅是这两个了:
    例如「顡」 \xE9\xA1\xA1,「硡」 \xE7\xA1\xA1, 「桡」 \xE6\xA1\xA1,或者「壬」 \xE5\xA3\xAC 之类的也是会被拦截的。只是这些字实在是比较少用而已了。
    至于为什么需要拦截,我个人想不出什么好的理由Discuz需要拦截这些字,所以删掉也不会影响安全之类的了。


    参考
    回复

    使用道具 举报

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

    本版积分规则

    Archiver|手机版|猫云社区 浙公网安备 33011802001168号

    GMT+8, 2019-2-18 18:17 , Processed in 0.055355 second(s), 9 queries , Xcache On.

    Powered by Discuz! X3

    © 2014-2016 MyDzHost | © 2001-2013 Template Design S!|Discuz! X3 © 2001-2013 Comsenz Inc

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