带有漏洞
凌晨两点,有漏洞我盯着屏幕上的有漏洞报错日志,第无数次怀疑自己是有漏洞不是选错了行当。
那个漏洞藏得很深,有漏洞深到像青春期少年藏在枕头底下的有漏洞日记。它不在显眼的有漏洞登录接口,不在常见的有漏洞SQL注入点,偏偏躲在密码重置功能的有漏洞某个边角——当用户输入一个不存在的邮箱时,系统会先查询数据库,有漏洞然后才返回“该邮箱未注册”。有漏洞就这么零点几秒的有漏洞时序差,足够让一个懂行的有漏洞人用时间盲注把整个用户表拖出来。我写了十年代码,有漏洞自认为对安全还算敏感,有漏洞可这个洞还是有漏洞在我眼皮底下躺了三个月。
修复它只需要三行代码。把查询顺序调换一下,先返回统一提示,再执行数据库操作。就这么简单。可就是这三行,让我想到了上个月那个被脱库的电商平台,他们的技术负责人是我前同事,出事那天他在朋友圈发了一句“该来的总会来”,配图是一杯没加糖的美式。
我们总说代码是逻辑的艺术,可实际上它更像一个漏水的屋顶。你修好一处,雨水会从另一处渗进来。上周我review一个新同事的代码,他在处理用户上传头像时,只校验了文件后缀名,没校验文件头。我问他为什么这么写,他愣了一下说:“文档里没写要校验文件头啊。”文档确实没写。可文档也没写“不要用123456当密码”,大家不还是知道不行吗?
这行当最吊诡的地方在于,漏洞从来不是技术问题,而是人性问题。懒惰、侥幸、赶工期、想当然——每个漏洞背后都站着一个疲惫的开发者,他可能刚跟女朋友吵完架,可能房贷要到期了,可能只是单纯地觉得“应该不会有人这么干吧”。我见过最离谱的一个洞,是因为开发者在注释里写了数据库连接密码,然后整个项目被推到公开仓库。不是不小心,是他觉得“反正项目没人看”。
后来我把那个时间盲注的漏洞修好了,加了监控,写了复盘报告。可我知道这只是暂时的。就像你永远堵不住所有漏水的地方,只能祈祷雨别下太大。昨天新来的实习生问我,这行是不是越做越胆小。我说不是胆小,是终于知道自己有多笨。
你问我为什么还在写代码?大概因为这屋顶虽然漏,但至少我还知道该往哪个方向补。比起那些压根不知道自己家漏水的人,我算幸运的。凌晨三点半,我终于关了电脑。窗外雨停了,明天大概是个晴天——但愿吧。
