2021年冬天,漏洞一个做电商的防御方法朋友半夜给我打电话,说服务器被打了。漏洞不是防御方法流量攻击,是漏洞有人利用他网站上一个老旧的文件上传接口,传了个webshell上去。防御方法我问他多久没更新那个模块了,漏洞他沉默了几秒说,防御方法大概三年。漏洞漏洞本身不复杂,防御方法是漏洞个很常见的任意文件上传,但三年没人管,防御方法就等于门锁坏了三年没修。漏洞这件事让我意识到,防御方法漏洞防御的漏洞核心压根儿不是技术多先进,而是你愿不愿意持续做那些枯燥的小事。
大多数漏洞的产生,说到底就两个原因:代码写错了,或者配置留了后门。代码层面的问题,SQL注入、XSS、命令执行,这些年年都在OWASP榜单上,年年有人中招。不是不知道,是赶工期的时候觉得“先上线再说”。我见过一个创业团队,后端接口连参数校验都没做,前端传什么就存什么,后来被人批量注册了十几万个垃圾账号,数据库差点撑爆。修复花了不到两天,但清理脏数据花了三周。
配置问题更隐蔽。默认密码、开放端口、调试模式没关、目录列表可访问——这些东西不会主动报错,安安静静地等着被人发现。有个做SaaS的客户,测试环境的数据库直接暴露在公网,密码是“admin123”。我问运维为什么,他说测试环境嘛,方便。方便谁?方便扫描器。
防御这件事,得从写代码的人开始。安全左移这个词听着挺唬人,其实就是别等到上线了才想起来检查。代码review的时候多问一句“这个输入有没有做过滤”,比事后打补丁省事一百倍。我自己的习惯是,任何跟用户输入打交道的地方,先假设它是恶意的。不是 paranoia,是经验。你永远不知道用户会往输入框里粘贴什么。
依赖管理也是个重灾区。Log4j那个漏洞爆出来的时候,多少团队连夜加班,结果发现项目里压根儿没人记得什么时候引入了这个库。第三方组件用起来爽,出了问题就是连锁反应。我的建议很简单:锁定版本,定期扫描,别用那些半年没更新的库。npm audit、OWASP Dependency-Check,这些工具跑一次花不了几分钟,但能帮你避开很多坑。
再说说补丁。很多人觉得打补丁麻烦,要停机、要测试、要回滚方案。但你不打,攻击者就帮你打——用最粗暴的方式。微软每个月发补丁,真正及时更新的企业不到六成。剩下的四成里,有多少在某个凌晨被勒索软件叫醒,我就不说了。我自己的服务器设置了自动更新,虽然偶尔会重启,但比被人端了强。
最后聊点实际的。漏洞防御没有银弹,别指望买个WAF就万事大吉。WAF能挡掉大部分自动化扫描,但挡不住有针对性的攻击。真正的防线是层层叠叠的:输入校验、参数化查询、最小权限原则、日志监控、定期渗透测试。每一层都不完美,但叠在一起,攻击成本就上去了。攻击者也是要算账的,你让他多花三个小时,他可能就换目标了。
那个电商朋友后来把整个上传模块重写了,加了文件类型白名单、内容检测、存储隔离。他说现在晚上能睡着了。漏洞不会消失,但你可以让它变得不那么容易得手。这事儿跟锁门一样,不是防住所有小偷,是让小偷觉得你家太费劲,不如去隔壁。
```