验证码不是安全措施,是一门成本分配
挑战到底由谁来买单、为什么误判总是集中在最不该流失的用户身上,以及该换成什么。
每一次挑战都是一笔交易。你花掉用户的一些时间和耐心,换回滥用的减少。这笔交易划不划算,完全取决于成本是怎么分摊的——而默认情况下,它被分摊给了「看起来不寻常」的人,那通常不是正在攻击你的人。
一、谁在买单
验证码向每一个到达的人收费,每次尝试几秒钟,外加一点烦躁。这笔成本最重地落在使用读屏软件的人、网络很慢的人、有运动障碍的人、母语不是图片里那种语言的人,以及那些处在 VPN 后面、或者和成千上万人共用同一个地址的人身上。这些群体在百分比上很小,却在你技术能力最强的那部分用户里占比极高。
二、为什么误判总是扎堆
风险评分是一个在排除了边缘样本的分布上训练出来的分类器。用企业 VPN 的用户、开了激进指纹随机化的隐私浏览器、在成千上万人共用一个地址的移动网络上的人——这些在统计上都显得古怪。如果挑战按固定阈值触发,它就会持续地对这批人触发,而他们的体验是「这个站有问题」,不是「这个站在保护我」。
三、没人做预算的第三方成本
接入 reCAPTCHA 在隐私上并不免费:每个访客、每个加载了该组件的页面,都会向 Google 发一个请求,并给另一份画像添砖。对于一个主打「你能看见别人收集了你什么」的站点,这个矛盾在可信度上很贵。在某些法域它还是个法律问题——一个把个人数据传往境外的挑战,需要你未必拥有的合法性基础。
四、在这之前该放什么
- 用真正的键做限流。按 IP 是最容易的那个,也是单独使用最错的那个:按账号、按会话、按前缀的限流能抓住 IP 限流漏掉的分布式滥用,同时不再惩罚共用 CGNAT 地址的人。
- 工作量证明。一个小的 JavaScript 谜题让攻击者每次尝试都付出真实 CPU,而让正常用户多等几百毫秒。它抬高的是量的价格,不要求任何人证明自己是人。
- 用基于风险的挑战,而不是一刀切。只在分数、速度或目标动作值得时才挑战,读取类页面永远不要。
- 用用户本来就有的第二因素。对账号类动作,邮箱确认或通行密钥既更安全、又比图片谜题更省事。
- 需要托管方案时用 Turnstile 或 hCaptcha——对多数访客它们无需交互,但令牌必须在服务端校验并绑定到具体动作,否则你只是白加了一个第三方脚本。
五、衡量这笔交易,而不是拦截量
多数团队只汇报拦下了多少滥用,从不衡量挑战的代价。把它量化:每个表单的完成率、从进入到提交的耗时、挑战这一步的流失、以及提到「验证」的客服工单。一个拦掉 90% 自动化尝试、同时丢掉 8% 真实注册的挑战,通常是笔坏买卖——而你没有第二个数字,就无法知道这一点。
六、一条让人不太舒服的规则
如果一个页面不加挑战也能读,那就别加。把摩擦放在对攻击者有价值的行为上——注册、找回密码、结账、任何会对外发消息的动作——然后放过浏览。接着接受会有一些滥用混进来:替代方案是拿那些什么都没做错的用户去付账。
ipbox.one 存在的部分意义,就是让这笔交易变得可见:它展示风险引擎会用来判断你这条连接的那些信号——「为什么我被挑战了」,答案通常就在这里。