天才用户取用户名为 null,害我熬夜查到两点……

数据库NoSQL数据库关系型数据库

你以为的 null 不是真的 null,但 bug 是真的 bug!

刷到一篇搞笑的帖子:

picture.image

用户取用户名为 "null"!

是的,你没看错,不是 Java 里的 null,不是 SQL 里的 NULL,而是一个货真价实的字符串 "null"!这玩意儿乍一看人畜无害,但只要你代码里稍不注意,它就能让你怀疑人生。

最近建了一些工作内推群,各大城市都有,欢迎各位HR和找工作的小伙伴进群交流,群里目前已经收集了不少的工作内推岗位。

扫码加苏三的微信:li_su223,备注:所在城市,即可进群。

picture.image

1. 程序员眼中的 "null" 有多搞笑?

想象一下,你在代码里写:

  
if (username == null) {  
    throw new IllegalArgumentException("用户名不能为空!");  
}  

然后用户提交:

  
{  
    "username": "null",  
    "password": "123456"  
}  

结果? 你的代码屁都没放,用户成功注册!

为啥?因为 "null" 是个合法的字符串 ,不是 null!你的代码根本不会拦截它,数据库里就多了一个幽灵用户,名字就叫 "null"。

更搞笑的是,日志里打印:

  
当前用户:null  

你以为是系统异常?不,人家就叫这个名!

用户名为 "null" 会带来哪些问题?

你以为只是个名字?天真!它能让你体验全方位崩溃

  • 用户体验炸裂
    登录后显示:“欢迎您,null!”
    用户:???我是谁?我在哪?
  • 日志排查地狱
    日志里全是 null,你根本分不清是真·空值 还是假·字符串 ,只能疯狂 debug。
  • 数据库污染
    导出 Excel、权限管理、用户去重时,突然冒出一个 "null",你以为是脏数据,结果人家是正经注册的。
  • 安全风险
    有些系统会把 "null" 当成特殊标识符,可能导致 XSS 或信息泄露。
  • 自动化脚本翻车
    很多脚本会跳过 null 值,结果 "null" 用户被漏掉,导致业务逻辑出错。

遇到这种问题怎么办?

别慌,老司机教你几招:

(1)严格校验用户名
别只检查 null,还要拦截 "null""undefined"、空格等毒瘤字符串:

  
private static final Set<String> ILLEGAL\_USERNAMES = Set.of(  
    "null", "undefined", " ", "\t", "\n", "admin", "root"  
);  
  
public void validateUsername(String username) {  
    if (username == null || ILLEGAL\_USERNAMES.contains(username.trim().toLowerCase())) {  
        throw new IllegalArgumentException("用户名非法!");  
    }  
}  

(2)前端也要拦截
别全甩锅给后端,前端表单校验加个规则:

  
if (["null", "undefined", ""].includes(username.trim())) {  
    alert("用户名不能是 null 或 undefined!");  
    return;  
}  

(3)数据库约束
加个 CHECK 约束,禁止存入非法用户名:

  
ALTER TABLE users ADD CONSTRAINT chk\_username   
CHECK (username NOT IN ('null', 'undefined', ' '));  

(4)日志区分真假 null
打印日志时加个标记:

  
logger.info("用户名为: {}", username == null ? "[NULL]" : username);  

终极建议:别让用户为你的代码买单

用户可能只是手滑,或者系统自动填充了个 "null",但最终熬夜 debug 的是你。所以:

  • 入口拦截 :注册、导入、API 调用,全都要校验!
  • 统一规范 :用户名只能包含字母、数字,长度限制,避免奇葩值。
  • 防御性编程 :永远假设用户会输入最离谱的数据!

所有被 "null" 坑过的程序员
你们不是一个人!下次再看到 "null",记得先喝杯咖啡,今晚可能又要熬了……

最后欢迎加入苏三的星球,你将获得:100万QPS短链系统、复杂的商城微服务系统、苏三AI项目、刷题吧小程序、秒杀系统、商城系统、秒杀系统、代码生成工具等8个项目的源代码、开发教程和技术答疑。

系统设计、性能优化、技术选型、底层原理、Spring源码解读、工作经验分享、痛点问题、面试八股文等多个优质专栏。

还有1V1免费修改简历、技术答疑、职业规划、送书活动、技术交流。

扫描下方二维码,可以优惠30元:

picture.image

只有20张优惠券, 数量有限,先到先得。

目前星球已经更新了5800+篇优质内容,还在持续爆肝中.....

星球已经被官方推荐了3次,收到了小伙伴们的一致好评。戳我加入学习,已有1900+小伙伴加入学习。

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
云原生数据库 veDB 核心技术剖析与展望
veDB 是一款分布式数据库,采用了云原生计算存储分离架构。本次演讲将为大家介绍火山引擎这款云原生数据库的核心技术原理,并对未来进行展望。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论