上个月做了一次全量代码安全审计,修了不少问题。但审计完了不代表就安全了,如果不把安全检查融入日常开发流程,过不了多久又会回到老样子。这篇文章聊聊我是怎么把安全检查变成日常习惯的。

为什么要融入日常

以前我们的安全检查是"运动式"的:出了问题或者上级要求了,才集中做一次审计。平时写代码的时候,根本不考虑安全问题。

这种模式的问题很明显:

  • 安全问题越积越多,一次审计修不完
  • 新代码继续引入安全问题,修了旧的又来新的
  • 开发者没有安全意识,觉得安全是安全团队的事

就像锻炼身体不能只靠每年一次体检,安全也不能只靠定期审计。得把安全检查融入到日常开发的每个环节,让它变成一种习惯。

提交前:本地自检

第一道防线是开发者本地自检。在提交代码之前,自己先检查一遍。

1. 提交前钩子(pre-commit hook)

我们在Git仓库里配置了pre-commit钩子,提交代码时自动运行:

  • PHP语法检查(php -l)
  • 代码风格检查(php-cs-fixer)
  • 简单的安全规则扫描(比如检测是否有eval、system等危险函数)

有问题就阻止提交,必须修完才能提交。虽然只能检查一些简单的问题,但能挡住大部分低级错误。

2. 代码自查清单

我整理了一份简单的自查清单,提交代码前过一遍:

  • 用户输入有没有做过滤和校验?
  • SQL查询有没有用预处理语句?
  • 输出到页面的内容有没有做XSS转义?
  • 文件操作有没有做路径校验?
  • 敏感信息(密钥、密码)有没有硬编码?
  • 错误信息会不会泄露系统细节?

不用每次都逐条看,但写涉及用户输入、数据库、文件操作的代码时,心里要有这根弦。

提交时:代码审查

第二道防线是代码审查(Code Review)。

我们的规定是:所有代码合并到主分支前,必须至少有一个人审查。审查不只是看功能实现,还要看安全。

审查时重点关注:

  • 有没有引入新的外部输入?这些输入有没有正确处理?
  • 有没有使用危险函数?有没有更安全的替代方案?
  • 权限控制是否正确?普通用户能不能越权操作?
  • 异常处理是否合理?会不会泄露敏感信息?
  • 依赖的第三方库有没有已知漏洞?

一开始大家不太习惯,觉得审查耽误时间。但坚持了几个月后,发现确实能挡住不少问题。而且审查的过程也是互相学习的过程,大家的安全意识都提高了。

合并后:自动化扫描

第三道防线是CI/CD流水线里的自动化扫描。

代码合并到主分支后,自动触发:

1. 静态代码分析

用静态分析工具扫描整个代码库,检测潜在的安全问题。虽然误报率不低,但能发现一些人工审查漏掉的问题。

2. 依赖漏洞扫描

检查项目依赖的第三方库有没有已知的CVE漏洞。有漏洞的库,要么升级,要么加防护。

3. 安全测试

对关键接口跑自动化安全测试,比如SQL注入、XSS、越权访问等。虽然不能覆盖所有场景,但能保证核心功能的基本安全。

扫描结果会自动生成报告,有高危问题就告警,必须在规定时间内修复。

运行时:监控和告警

第四道防线是运行时的监控和告警。代码上线了不代表就安全了,还要持续监控。

1. 异常监控

监控系统的异常日志,比如大量的403、404、500错误,可能是有人在扫描或攻击。异常流量自动告警,及时处理。

2. 访问日志分析

定期分析访问日志,看看有没有可疑的请求模式,比如SQL注入尝试、路径穿越尝试、**破解等。发现攻击苗头,及时封禁IP。

3. 数据备份

这个不算安全检查,但很重要。定期备份数据,万一被攻击了,能快速恢复。备份还要定期演练恢复,别等到要用的时候才发现备份是坏的。

持续:安全培训和复盘

最后一道防线是人的意识。工具和流程都是辅助,真正的安全还是靠人。

1. 定期安全培训

每季度做一次安全培训,分享最近的安全事件、常见的攻击手法、我们自己踩过的坑。让大家知道安全不是遥不可及的,而是和每个人息息相关的。

2. 安全事件复盘

每次出现安全问题(不管是真实的攻击还是测试发现的),都做一次复盘。不是为了追责,而是为了搞清楚:问题出在哪里?为什么之前的检查没发现?怎么改进流程避免再犯?

3. 建立安全知识库

把常见的安全问题、修复方案、最佳实践整理成知识库,方便大家查阅。新人入职先学一遍,老人遇到问题也能快速找到参考。

一些心得

1. 安全是每个人的责任

不要觉得安全是安全团队的事。写代码的人不注意安全,安全团队再怎么查也查不完。每个人都要有安全意识,把安全当成自己工作的一部分。

2. 不要追求完美

没有绝对安全的系统。我们能做的是提高攻击成本,让攻击者觉得"不值得"。不要因为做不到100分就不做,60分也比0分强。

3. 自动化能省很多事

能自动化的就自动化。人工检查容易遗漏、容易偷懒,自动化工具不会。把重复的检查交给工具,人来做更有价值的判断。

4. 安全和效率不是对立的

很多人觉得安全检查会拖慢开发速度。其实不是的,前期多花十分钟检查,后期可能省了十天的修复时间。而且安全做好了,出事故的概率低了,反而能更安心地做功能。

写在最后

安全不是一次性的项目,而是持续的过程。就像健身不能只靠办一张健身卡,安全也不能只靠一次审计。

把安全检查融入到日常开发的每个环节:提交前自检、提交时审查、合并后扫描、运行时监控、持续培训复盘。让安全变成一种习惯,而不是一项任务。

这条路很长,但每一步都算数。