你有没有遇到过这样的情况?同事写的代码看起来乱糟糟的,变量名像“a1”、“temp2”,函数动辄几百行,改个功能得小心翼翼,生怕牵一发而动全身。这不只是看着难受,更可能埋下安全隐患。
命名随意,自己都看不懂
很多人写代码图快,变量直接叫“data”、“list”、“flag”。时间一长,连自己都忘了这个“flag”到底代表登录状态还是权限开关。这种模糊命名在多人协作时尤其危险,容易导致逻辑判断出错,甚至被攻击者利用。
比如下面这段:
int flag = 0;
if (user.isAdmin()) {
flag = 1;
}
// ... 几百行后
if (flag == 1) {
deleteAllFiles();
}
如果中间有人误改了 flag 的值,或者没注意到它的含义,系统就可能在不该删文件的时候执行删除操作。
缩进混乱,逻辑看走眼
该缩进的地方不缩进,大括号随便放,一眼看去分不清哪段代码属于哪个分支。这种混乱容易让人误判程序走向。
比如:
if (user.isAuthenticated())
logAccess();
grantPrivilege(); // 这行其实不在 if 里!
表面看像是认证通过才授权,实际上授权是无条件执行的。这种视觉陷阱在安全关键代码中极其致命。
注释跟不上代码
有些注释写的是“此处校验用户身份”,可代码早就改成直接放行了。这类“过期注释”比没有注释还危险,会误导维护者做出错误判断。
更糟的是满屏 TODO 和 FIXME,拖了几个月没人管,最后成了系统里的定时炸弹。
硬编码密码和密钥
把数据库密码直接写在代码里,上传到仓库,这是不少新手踩过的坑。就算项目私有,一旦泄露,攻击者就能直连后台。
比如:
String dbPassword = "123456abc"; // 千万别这么干
正确的做法是使用环境变量或配置中心管理敏感信息,避免出现在代码中。
函数又臭又长
一个函数干十件事,从参数校验、数据查询、业务处理到日志记录全包了。这种“巨无霸函数”不仅难测试,修改时也容易引入副作用。
安全相关的逻辑夹杂在一堆无关操作里,审查时很容易被忽略。拆分成小函数,职责清晰,才能有效防范风险。
异常处理敷衍了事
很多代码里都是 catch 一下,打印个日志就完事。甚至直接 catch Exception,啥都不做,俗称“吞异常”。
这样做的后果是,系统出了问题毫无痕迹,攻击行为也可能被掩盖。该重试的没重试,该告警的没告警,等发现时往往已经晚了。
忽视输入校验
用户传什么就信什么,不验证长度、类型、格式。这种松懈是 SQL 注入、XSS 攻击的温床。
哪怕只是内部接口,也不能掉以轻心。一次没校验的用户名,可能就让一段脚本注入到页面里,悄悄盗走其他用户的登录凭证。