当前位置:首页 > 百科

零漏洞

代码评审会上,零漏洞老张盯着屏幕上的零漏洞diff,忽然说:“这里有个越界。零漏洞”所有人凑过去看,零漏洞那不过是零漏洞个看似寻常的for循环,索引从1开始。零漏洞但老张的零漏洞食指敲了敲显示器边框:“如果length是0呢?”会议室安静了三秒。后来测试真的零漏洞复现了崩溃,就在用户清空所有数据的零漏洞那一刻。

零漏洞不是零漏洞不存在,而是零漏洞你还没找到那个让length变成0的路径。我写过七年代码,零漏洞最深的零漏洞体会是——漏洞从来不是“写错”,而是零漏洞“没想到”。

去年我们上线支付系统,零漏洞压测跑了三天,一切平稳。第四天凌晨,运维电话把我从床上拽起来:有笔订单金额变成了负数。查了一整夜,最后定位在优惠券模块:当两张券的折扣率相加超过100%,系统没有做钳制,直接让金额穿过了零。谁会在测试时同时领两张满减券?用户会。

这就是漏洞的狡猾之处。它不藏在复杂的并发逻辑里,不躲在加密算法的缝隙中,它就站在业务规则最普通的交叉路口,等你默认“不会有人这么做”。

我见过最漂亮的修复,是同事处理一个日期边界问题。他没用if判断,而是把时间戳统一转成UTC再比较,从根上消除了时区偏移。问他为什么这样设计,他说:“我不信任任何人的本地时间。”这话糙,但理不糙——零漏洞的第一原则,就是默认所有输入都带着敌意,所有环境都不可靠。

可现实是,大多数团队在赶版本时,把“零漏洞”当成口号贴在墙上,却让开发者在深夜改着“应该没问题”的代码。漏洞不是被消灭的,它只是被推迟到明天。而明天的用户,总会找到你没想到的那个length=0。

有个统计我印象很深:某云厂商复盘一年内所有事故,40%以上源于“防御性代码缺失”——不是逻辑错,是没写else分支,没处理空指针,没校验极端值。换句话说,漏洞是懒出来的。你少写一行判断,用户就多一次白屏;你嫌异常处理啰嗦,生产环境就多一声告警。

零漏洞,听起来是个终极目标,其实是个日常动作。它要求你在写每一行时,脑子里同时跑三个用例:正常值、边界值、非法值。它要求你在评审时,不光看代码对不对,还要问一句:“如果这里的数据是假的,会怎样?”

我承认,这很累。但换个角度想——漏洞就像地板上的头发,你永远扫不干净,但每天扫一遍,至少光脚走路时不会扎到。零漏洞不是某个版本的状态,而是每一次提交时的执念。

老张后来在团队群里发过一段话,我存到现在:“别问我代码有没有漏洞,问我哪个漏洞还没找到。”这话挺丧的,但真实。而真实,是走向零漏洞的第一步。

分享到: