如何在数据库表字段中搜索隐形字符,解决重复用户名问题?
问题排查与修复方案
问题表现
- 已设置用户名字段唯一约束的数据库表,在phpMyAdmin、SqlYog中查看时存在视觉上重复的用户名
- 重复用户名在网页渲染后查看HTML源码,可发现前面带有
‏(右向左标记)HTML实体,该字符无可见视觉表现,不会在页面直接展示 - 使用SQL语句
SELECT * FROM mytable WHERE username LIKE '%‏%';查询无对应结果,原因是数据库中存储的是隐形字符本身,而非转义后的HTML实体 - 从SqlYog导出数据到Excel时,该隐形字符会显示为
â€乱码
修复步骤
查询包含RLM隐形字符的记录
RLM字符的Unicode编码为U+200F,MySQL/MariaDB环境可使用如下语句查询:
SELECT * FROM mytable WHERE HEX(username) LIKE CONCAT('%', HEX(CHAR(0x200F using utf8mb4)), '%');
清理用户名中的冗余隐形字符
确认该字符为非法注入内容后,执行如下语句批量清理:
UPDATE mytable SET username = REPLACE(username, CHAR(0x200F using utf8mb4), '');
后续防护建议
- 在用户名注册、修改的业务接口新增校验逻辑,过滤所有Unicode控制类字符,避免同类隐形字符被注入
- 用户名入库前统一做字符归一化处理,配合数据库唯一约束彻底避免同类重复问题
内容的提问来源于stack exchange,提问作者Geoffrey
相关产品推荐
相关产品推荐

