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

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

刷到一篇搞笑的户名l害帖子:

图片

用户取用户名为 "null"!

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

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

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

复制if (username == null) { throw new IllegalArgumentException("用户名不能为空!户名l害"); }1.2.3.

然后用户提交:

复制{ "username": "null",熬夜 "password": "123456" }1.2.3.4.

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

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

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

复制当前用户:null1.

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

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

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

用户体验炸裂登录后显示:“欢迎您,null!”用户:???我是谁?我在哪?日志排查地狱日志里全是 null,你根本分不清是真·空值还是假·字符串,只能疯狂 debug。数据库污染导出 Excel、权限管理、用户去重时,突然冒出一个 "null",你以为是脏数据,结果人家是正经注册的。安全风险有些系统会把 "null" 当成特殊标识符,IT技术网可能导致 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("用户名非法!"); } }1.2.3.4.5.6.7.8.9. (2)前端也要拦截

别全甩锅给后端,前端表单校验加个规则:

复制if (["null", "undefined", ""].includes(username.trim())) { alert("用户名不能是 null 或 undefined!"); return; }1.2.3.4. (3)数据库约束

加个 CHECK 约束,禁止存入非法用户名:

复制ALTER TABLE users ADD CONSTRAINT chk_username CHECK (username NOT IN (null, undefined, ));1.2. (4)日志区分真假 null

打印日志时加个标记:

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

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

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

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

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

数据库
上一篇:电脑显示临时DNS错误的解决方法(快速修复电脑临时DNS错误的有效步骤)
下一篇:好吧,研究了半天终于搞定,和之前的14.04版本安装不一样,因为那种安装方法在此系统下不行,这我就分享一下了。软件名称:搜狗输入法 for Linux 2.0.0.0066 中文官方安装版 64位软件大小:17.8MB更新时间:2015-10-191、首先下载linux版本的某狗安装包吧! 2、我们在结果中点击官方的那个地址进入并下载与你系统位数一致的输入法,我这里是32位的ubuntu,我就下载32位的了!3、下载好后,我们来安装一个工具输入命令: sudo apt-get install gdebi,后按enter执行4、然后,终端会叫你按(Y/N)来决定是否真的安装,我们输入Y,然后按回车键继续。5、安装完成后,我们别关闭终端在终端中继续输入: cd 下载的某狗文件所在目录,我这里就输入:cd 下载,因为我下载的某狗在下载目录。6、进入到你某狗所在的目录后输入:sudo gdebi so 然后按tab键补全搜狗的文件名称按,按enter执行后,等待某狗安装完成。假如期间提示“您是否想要安装这个软件包(Y/N)”,那么你输入“Y”然后按回车键就可以了7、安装完成后,我们点击系统屏幕右上角的那个齿轮图标,然后点击“注销”,注销一下系统,假如无法注销,那么重启一下也可以的。注销完成后,重新进入系统。按“Ctrl+Shift”键切唤出某狗输入法,这样我们就能够使用它了。