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

  • 2025-07-02
  • dfer
  • 7
点击关注公众号,Java 干货及时推送↓

推荐阅读:今年 Java 后端薪资还可以!

大家好,我是R哥。

前几天刷到一篇帖子:

标题直接让我笑出声。。

这年头,像字符串 "null""undefined"、空格、特殊符号这些聪明的用户名,绝对能让你当场沉默三秒,然后通宵 debug 八小时。

比如用户注册时输入以下内容:

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

如果你的后端判断逻辑是这样的:

if (user.getUsername() == null) {
    thrownew IllegalArgumentException("用户名不能为空");
}

这个 JSON 发到后端,上面的代码判断完全不触发异常,因为字符串 "null" 是合法字符串。你数据库里就多了个"幽灵用户",用户名叫 null,但你日志里查不到它,因为你以为是系统产生的异常用户。

用户名为 "null" 会有什么问题?

"null" 不是 null,却能带来比 null 更多的问题

1、从用户体验角度

用户名是用来标识用户身份的,如果叫 "null",对普通用户来说是非常困惑的:

欢迎您,null!

看到这个用户名是不是很诡异?

有些用户根本不知道 "null" 是什么意思,他可能是误操作、自动填充、或者是系统导入数据时产生的。

插播一条:如果你近期准备面试跳槽,点击Java面试库小程序刷题吧,共 3000+ 道,几乎覆盖了所有主流 Java 技术面试题。

2、从开发和维护角度

比如在某个功能中,如果 username 是 "null",日志中打印的就是:

当前用户名为:null

你怎么区分它是字符串 "null",还是字段真的为空?

另外还会带来许多问题:

  • 在数据库里查重、导出 Excel、做权限审核时,看到 "null" 用户,你能分辨这是不是异常数据吗?

  • 很多自动化脚本或系统工具对 "null" 都有特殊处理,可能会误判或跳过这个用户

3、从系统安全角度

有些攻击者会专门利用 "null""undefined"、空格、emoji 这些边界值试探你的系统防御机制。

另外,"null" 作为特殊标识符,在某些技术框架中被当作系统变量、占位符处理,有可能造成潜在的 XSS / 信息泄露 风险。

4、从一致性和规范角度

如果系统允许 "null" 作为用户名,那是否也允许:

  • "undefined"

  • "0"

  • 空格 " "

  • emoji "💩"

  • "admin"(不是真的管理员)

  • ...

还有更多脏乱差,以及污秽的用户名是否也都允许?

5、从排查问题的角度

为了排查 "null" 引起的这类问题你可能会:

  • 抓包,分析请示;

  • 排查后端日志;

  • 去代码里加一堆断点;

  • 清理缓存;

  • 排查数据库看有没有空值,就算看到 null 值,也可能很难分清它是真的为 null 还是字符串 null;

  • ...

排查半天,一波操作下来,才发现,原来它不是 null,而是 "null",于是修复 bug,做数据清洗,一搞就是一个通宵。

插播一条:如果你近期准备面试跳槽,点击Java面试库小程序刷题吧,共 3000+ 道,几乎覆盖了所有主流 Java 技术面试题。

应该如何正确处理 "null" 用户名?

虽然从技术角度来看,字符串 "null" 是一个合法的非空字符串,不会触发 null 判断,也不会导致程序直接报错,但从产品体验、安全性、运维排查等多个角度来看,这个值应当被视为非法输入,应当主动拦截。

我们必须对用户名做更严格的校验:

private static final Set<String> ILLEGAL_USERNAMES = new HashSet<>(Arrays.asList(
    "null", "undefined", "true", "false", "admin", "root", "", " ", "\t", "\n"
));

public void validateUsername(String username) {
    if (username == null || ILLEGAL_USERNAMES.contains(username.trim().toLowerCase())) {
        throw new IllegalArgumentException("用户名非法或为空");
    }
}

示例代码,仅供参考。

有一次我们开发后台管理系统,运营在批量上传用户时,Excel 里有个单元格空着,他以为空着就不导入了。结果我们用 Apache POI 解析出来后,那个单元格读取出来的是字符串 "null",你敢信?

于是后台多了几个用户名叫 "null" 的运营账号,权限还不低,吓得我差点报警……

作为后端开发者,不仅要写出正确逻辑,还要能预判用户行为 + 防御边界值 + 拦住异常数据,这种合法毒瘤字符串必须在入口就拦下来。

你如果都不做拦截,系统迟早崩溃,与其事后清理、兼容,不如一开始就定好规范,用户名只能包含特定字符,长度有限制,不允许使用系统保留词或语义不清的字符串

所以不管数据来自前端输入、Excel 导入、接口接入,哪怕是自己写的测试脚本,你都要做同样一件事:先校验,再处理,不然出现问题有得你排查。

版权声明: 本文系公众号 "Java技术栈" 原创,转载、引用本文内容请注明出处,抄袭、洗稿一律投诉侵权,后果自负,并保留追究其法律责任的权利。


↓↓↓点下面小程序刷题突击面试↓↓↓

推荐阅读:

1. Java 24 正式发布,超神了。。。

2. Spring Boot 3.5 正式发布,王炸级更新!

3. Spring AI 1.0 发布,让 Java 再次伟大!

4. 现在的 Java 行情,没人能轻松通过面试。

5. 什么情况,今年面试都不问八股文了??

6. 面试了个 7 年 Javaer,真让我哭笑不得!

7. 面试通过,背调凉凉。。

8. Spring Boot 3.x 又又又更新了!

9. Spring Cloud 微服务实战(2025 最新版)

10. 2025 全新 Java 面试题(3000+)

关注公众号学习最主流的 Java 技术↓