大卓 發表於 2025-7-2 17:06:00

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

<p>大家好,我是R哥。</p>
<p>前几天刷到一篇帖子:</p>
<p><img src="https://img2024.cnblogs.com/other/1218593/202507/1218593-20250702170613493-579445422.png"></p>
<p>标题直接让我笑出声。。</p>
<p>这年头,像字符串 <code>"null"</code>、<code>"undefined"</code>、空格、特殊符号这些聪明的用户名,绝对能让你当场沉默三秒,然后通宵 debug 八小时。</p>
<p>比如用户注册时输入以下内容:</p>
<pre><code class="language-json">{
&nbsp;&nbsp;"username":&nbsp;"null",
&nbsp;&nbsp;"password":&nbsp;"123456"
}
</code></pre>
<p>如果你的后端判断逻辑是这样的:</p>
<pre><code class="language-json">if&nbsp;(user.getUsername() ==&nbsp;null) {
&nbsp; &nbsp;&nbsp;thrownew&nbsp;IllegalArgumentException("用户名不能为空");
}
</code></pre>
<p>这个 JSON 发到后端,上面的代码判断完全不触发异常,因为字符串 <code>"null"</code> 是合法字符串。你数据库里就多了个"<strong>幽灵用户</strong>",用户名叫 <strong>null</strong>,但你日志里查不到它,因为你以为是系统产生的异常用户。</p>
<h2 id="用户名为-null-会有什么问题">用户名为 "null" 会有什么问题?</h2>
<blockquote>
<p><strong>"null" 不是 null,却能带来比 null 更多的问题</strong>。</p>
</blockquote>
<h3 id="1从用户体验角度">1、从用户体验角度</h3>
<p>用户名是用来标识用户身份的,如果叫 <code>"null"</code>,对普通用户来说是非常困惑的:</p>
<pre><code>欢迎您,null!
</code></pre>
<p>看到这个用户名是不是很诡异?</p>
<p>有些用户根本不知道 <code>"null"</code> 是什么意思,他可能是误操作、自动填充、或者是系统导入数据时产生的。</p>
<h3 id="2从开发和维护角度">2、从开发和维护角度</h3>
<p>比如在某个功能中,如果 <code>username</code> 是 <code>"null"</code>,日志中打印的就是:</p>
<pre><code>当前用户名为:null
</code></pre>
<p>你怎么区分它是字符串 <code>"null"</code>,还是字段真的为空?</p>
<p>另外还会带来许多问题:</p>
<ul>
<li>在数据库里查重、导出 Excel、做权限审核时,看到 <code>"null"</code> 用户,你能分辨这是不是异常数据吗?</li>
<li>很多自动化脚本或系统工具对 <code>"null"</code> 都有特殊处理,<strong>可能会误判或跳过这个用户</strong>。</li>
</ul>
<h3 id="3从系统安全角度">3、从系统安全角度</h3>
<p>有些攻击者会专门利用 <code>"null"</code>、<code>"undefined"</code>、空格、emoji 这些边界值试探你的系统防御机制。</p>
<p>另外,<code>"null"</code> 作为特殊标识符,在某些技术框架中被当作<strong>系统变量、占位符</strong>处理,有可能造成潜在的 <strong>XSS / 信息泄露</strong> 风险。</p>
<h3 id="4从一致性和规范角度">4、从一致性和规范角度</h3>
<p>如果系统允许 <code>"null"</code> 作为用户名,那是否也允许:</p>
<ul>
<li><code>"undefined"</code></li>
<li><code>"0"</code></li>
<li>空格 <code>" "</code></li>
<li>emoji <code>"💩"</code></li>
<li><code>"admin"</code>(不是真的管理员)</li>
<li>...</li>
</ul>
<p>还有更多脏乱差,以及污秽的用户名是否也都允许?</p>
<h3 id="5从排查问题的角度">5、从排查问题的角度</h3>
<p>为了排查 "<strong>null</strong>" 引起的这类问题你可能会:</p>
<ul>
<li>抓包,分析请示;</li>
<li>排查后端日志;</li>
<li>去代码里加一堆断点;</li>
<li>清理缓存;</li>
<li>排查数据库看有没有空值,就算看到 null 值,也可能很难分清它是真的为 null 还是字符串 null;</li>
<li>...</li>
</ul>
<p>排查半天,一波操作下来,才发现,原来它不是 null,而是 <code>"null"</code>,于是修复 bug,做数据清洗,一搞就是一个通宵。</p>
<h2 id="应该如何正确处理-null-用户名">应该如何正确处理 "null" 用户名?</h2>
<p>虽然从技术角度来看,字符串 <code>"null"</code> 是一个<strong>合法的非空字符串</strong>,不会触发 <code>null</code> 判断,也不会导致程序直接报错,但从<strong>产品体验、安全性、运维排查</strong>等多个角度来看,这个值应当被视为<strong>非法输入</strong>,应当主动拦截。</p>
<p>我们必须对用户名做更严格的校验:</p>
<pre><code class="language-java">private static final Set&lt;String&gt; ILLEGAL_USERNAMES = new HashSet&lt;&gt;(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("用户名非法或为空");
    }
}
</code></pre>
<blockquote>
<p>示例代码,仅供参考。</p>
</blockquote>
<p>有一次我们开发后台管理系统,运营在批量上传用户时,Excel 里有个单元格空着,他以为空着就不导入了。结果我们用 Apache POI 解析出来后,那个单元格读取出来的是字符串 <code>"null"</code>,你敢信?</p>
<p>于是后台多了几个用户名叫 "<strong>null</strong>" 的运营账号,权限还不低,吓得我差点报警……</p>
<p>作为后端开发者,不仅要写出正确逻辑,还要能<strong>预判用户行为 + 防御边界值 + 拦住异常数据</strong>,这种合法毒瘤字符串必须在入口就拦下来。</p>
<p>你如果都不做拦截,系统迟早崩溃,与其事后清理、兼容,不如一开始就定好规范,用户名只能包含特定字符,长度有限制,<strong>不允许使用系统保留词或语义不清的字符串</strong>。</p>
<p>所以不管数据来自<strong>前端输入、Excel 导入、接口接入</strong>,哪怕是自己写的测试脚本,你都要做同样一件事:<strong>先校验,再处理</strong>,不然出现问题有得你排查。</p>
<blockquote>
<p><strong>版权声明:</strong> 本文系公众号 "Java技术栈" 原创,转载、引用本文内容请注明出处,抄袭、洗稿一律投诉侵权,后果自负,并保留追究其法律责任的权利。</p>
</blockquote>
<p><strong>更多文章推荐:</strong></p>
<p>1.Spring Boot 3.x 教程,太全了!</p>
<p>2.3,000+ 道 Java面试题及答案整理(最新版)</p>
<p>3.免费获取 IDEA 激活码的 7 种方式(最新版)</p>
<p>4.Java &amp; DeepSeek &amp; AI 学习资料分享</p>
<p>5.程序员精美简历模板分享</p>
<p>觉得不错,别忘了随手点赞+转发哦!</p>


</div>
<div id="MySignature" role="contentinfo">
   
<div style="clear: both"></div><br><br>
来源:https://www.cnblogs.com/javastack/p/18961772
頁: [1]
查看完整版本: 天才用户取用户名为 null,害我熬夜查到两点…….