20个必看的代码审查清单,让安全和性能不再翻车!(附真实案例)
在软件开发的江湖混久了,我逐渐明白了一个道理:写得快不代表写得好。尤其是当我经历过几次凌晨3点线上事故后,我更深刻地理解到代码审查的重要性。今天分享的这份清单,是我5年工作经验的结晶,特别适合项目组内部分享,希望能帮大家少踩几个坑。
🚀 安全审查八项军规
1. **SQL注入必须死**:见过新人写的`"SELECT * FROM users WHERE id = "+userId`吗?3个月前我们测试环境被这样注入过,解决方案很简单——只要发现字符串拼接SQL,直接打回。
2. **密码存储别裸奔**:去年有个外包项目直接用MD5存密码,结果在GitHub上被白帽子点名。现在必须用`bcrypt`或`PBKDF2`,加盐参数至少要16位。
3. **XSS防护不能忘**:上周修复的案例显示,即使用Vue框架也可能通过`v-html`中招。推荐的做法是入库前用OWASP的`Java HTML Sanitizer`处理富文本。
4. **CORS配置要精细**:有些开发图省事配`Access-Control-Allow-Origin: *`,去年导致用户数据泄露。正确的做法是严格指定可信域名清单。
5. **CSRF令牌必须有**:Spring Security默认就带CSRF防护,但有人会手动关闭。记住:所有修改操作必须验证令牌。
6. **Log别泄露敏感信息**:真实案例:某系统日志输出完整信用卡号被安全团队抓包,罚了三个月绩效。建议用`*******`替换关键字段。
7. **依赖包版本要锁定**:去年`log4j2`漏洞事件告诉我们,别相信`latest`版本!必须用`maven-enforcer-plugin`锁定版本号。
8. **文件上传要验签**:最近有攻击者上传`.jsp`伪装成图片。应该在服务端验证文件头魔数,存储时重命名文件。
⚡ 性能审查六个关键点
9. **N+1查询必须死**:我们系统曾经有个接口循环查数据库,TPS从200掉到5。用`@BatchSize`或JOIN查询能轻松解决。
10. **大事务拆小原则**:见过一个保存方法加了@Transactional,结果锁表2分钟。建议单条记录操作不超过200ms。
11. **缓存穿透防护**:用Redis要设空值缓存(TTL设短点),去年促销活动时救了我们一命。
12. **线程池拒绝策略**:有团队直接用`Executors.newFixedThreadPool`,OOM后才发现默认队列无限大。务必自定义`ThreadPoolExecutor`。
13. **序列化优化**:PB比JSON快3倍不是吹的,去年网关改造后,平均响应时间从50ms降到15ms。
14. **避免大对象**:我们遇到过8MB的DTO在Kafka里堵住整个集群。建议单条消息不超过100KB。
🛠️ 代码质量六个细节
15. **魔法值滚粗**:看到代码里出现`if(status == 3)`直接拒掉,必须定义常量。
16. **异常处理要专业**:最烦`catch(Exception e){continue;}`这种代码,至少打印堆栈!
17. **循环中忌IO**:有个同事在for循环里调第三方API,结果500次调用超时。应该批量处理。
18. **DTO/VO要分明**:见过把数据库实体直接返给前端的,字段泄露不说,还带了`@Version`注解。
19. **日期处理标准化**:禁止出现`new Date()`!必须用`Instant`或`LocalDateTime`。
20. **代码重复度检查**:用SonarQube扫一遍,重复率超5%的模块建议重构。
💡 真实血泪教训
去年我们有个服务上线后CPU跑满,回查发现是有人在循环里调`Collections.sort`。按这个清单第9条检查就能避免。还有一次安全扫描报高危,原因是用了过期的`Apache Commons`组件,其实第7条已经明确要求了。
给大家的建议是:把这份清单打印出来贴在工位上,代码审查时逐条核对。刚开始可能觉得麻烦,等真正躲过几次事故后,你就会感谢现在的自己。至于那些总说「先上线再优化」的同事...建议他们半夜接几次报警电话就老实了。
> 你觉得哪条最实用?欢迎留言分享你的代码审查故事(要是吐槽同事的记得匿名😂)
1911

被折叠的 条评论
为什么被折叠?



