你以為的 null 不是真的 null,但 bug 是真的 bug!
刷到一篇搞笑的帖子:

用戶取用戶名為 "null"!
是的,你沒看錯,不是 Java 里的 null
,不是 SQL 里的 NULL
,而是一個貨真價實的字符串 "null"!這玩意兒乍一看人畜無害,但只要你代碼里稍不注意,它就能讓你懷疑人生。
1. 程序員眼中的 "null" 有多搞笑?
想象一下,你在代碼里寫:
if (username == null) {
throw new IllegalArgumentException("用戶名不能為空!");
}
然后用戶提交:
{
"username": "null",
"password": "123456"
}
結果? 你的代碼屁都沒放,用戶成功注冊!
為啥?因為 "null"
是個合法的字符串,不是 null
!你的代碼根本不會攔截它,數據庫里就多了一個幽靈用戶,名字就叫 "null"。
更搞笑的是,日志里打?。?/span>
當前用戶:null
你以為是系統(tǒng)異常?不,人家就叫這個名!
用戶名為 "null" 會帶來哪些問題?
你以為只是個名字?天真!它能讓你體驗全方位崩潰:
用戶體驗炸裂
登錄后顯示:“歡迎您,null!”
用戶:???我是誰?我在哪?
日志排查地獄
日志里全是 null
,你根本分不清是真·空值還是假·字符串,只能瘋狂 debug。
數據庫污染
導出 Excel、權限管理、用戶去重時,突然冒出一個 "null",你以為是臟數據,結果人家是正經注冊的。
安全風險
有些系統(tǒng)會把 "null"
當成特殊標識符,可能導致 XSS 或信息泄露。
自動化腳本翻車
很多腳本會跳過 null
值,結果 "null" 用戶被漏掉,導致業(yè)務邏輯出錯。
遇到這種問題怎么辦?
別慌,老司機教你幾招:
(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)前端也要攔截
別全甩鍋給后端,前端表單校驗加個規(guī)則:
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)日志區(qū)分真假 null
打印日志時加個標記:
logger.info("用戶名為: {}", username == null ? "[NULL]" : username);
終極建議:別讓用戶為你的代碼買單
用戶可能只是手滑,或者系統(tǒng)自動填充了個 "null"
,但最終熬夜 debug 的是你。所以:
- 統(tǒng)一規(guī)范:用戶名只能包含字母、數字,長度限制,避免奇葩值。
所有被 "null" 坑過的程序員
你們不是一個人!下次再看到 "null"
,記得先喝杯咖啡,今晚可能又要熬了……
閱讀原文:原文鏈接
該文章在 2025/9/3 10:26:21 編輯過