菜单

首页

全部入口

外观

位置:🇺🇸 美国
主站 gistwillan.top
返回博客
摩擦设计 · 3 分钟

验证码不是安全措施,是一门成本分配

挑战到底由谁来买单、为什么误判总是集中在最不该流失的用户身上,以及该换成什么。

浅色键盘特写
Alexander-design · CC0 Wikimedia Commons

每一次挑战都是一笔交易。你花掉用户的一些时间和耐心,换回滥用的减少。这笔交易划不划算,完全取决于成本是怎么分摊的——而默认情况下,它被分摊给了「看起来不寻常」的人,那通常不是正在攻击你的人。

拦下的比例,以及被一起挡掉的真实用户
这两个数字必须一起看:只看前者,任何挑战都像成功。

一、谁在买单

验证码向每一个到达的人收费,每次尝试几秒钟,外加一点烦躁。这笔成本最重地落在使用读屏软件的人、网络很慢的人、有运动障碍的人、母语不是图片里那种语言的人,以及那些处在 VPN 后面、或者和成千上万人共用同一个地址的人身上。这些群体在百分比上很小,却在你技术能力最强的那部分用户里占比极高。

二、为什么误判总是扎堆

风险评分是一个在排除了边缘样本的分布上训练出来的分类器。用企业 VPN 的用户、开了激进指纹随机化的隐私浏览器、在成千上万人共用一个地址的移动网络上的人——这些在统计上都显得古怪。如果挑战按固定阈值触发,它就会持续地对这批人触发,而他们的体验是「这个站有问题」,不是「这个站在保护我」。

三、没人做预算的第三方成本

接入 reCAPTCHA 在隐私上并不免费:每个访客、每个加载了该组件的页面,都会向 Google 发一个请求,并给另一份画像添砖。对于一个主打「你能看见别人收集了你什么」的站点,这个矛盾在可信度上很贵。在某些法域它还是个法律问题——一个把个人数据传往境外的挑战,需要你未必拥有的合法性基础。

四、在这之前该放什么

  • 用真正的键做限流。按 IP 是最容易的那个,也是单独使用最错的那个:按账号、按会话、按前缀的限流能抓住 IP 限流漏掉的分布式滥用,同时不再惩罚共用 CGNAT 地址的人。
  • 工作量证明。一个小的 JavaScript 谜题让攻击者每次尝试都付出真实 CPU,而让正常用户多等几百毫秒。它抬高的是量的价格,不要求任何人证明自己是人。
  • 用基于风险的挑战,而不是一刀切。只在分数、速度或目标动作值得时才挑战,读取类页面永远不要。
  • 用用户本来就有的第二因素。对账号类动作,邮箱确认或通行密钥既更安全、又比图片谜题更省事。
  • 需要托管方案时用 Turnstile 或 hCaptcha——对多数访客它们无需交互,但令牌必须在服务端校验并绑定到具体动作,否则你只是白加了一个第三方脚本。

五、衡量这笔交易,而不是拦截量

多数团队只汇报拦下了多少滥用,从不衡量挑战的代价。把它量化:每个表单的完成率、从进入到提交的耗时、挑战这一步的流失、以及提到「验证」的客服工单。一个拦掉 90% 自动化尝试、同时丢掉 8% 真实注册的挑战,通常是笔坏买卖——而你没有第二个数字,就无法知道这一点。

六、一条让人不太舒服的规则

如果一个页面不加挑战也能读,那就别加。把摩擦放在对攻击者有价值的行为上——注册、找回密码、结账、任何会对外发消息的动作——然后放过浏览。接着接受会有一些滥用混进来:替代方案是拿那些什么都没做错的用户去付账。

ipbox.one 存在的部分意义,就是让这笔交易变得可见:它展示风险引擎会用来判断你这条连接的那些信号——「为什么我被挑战了」,答案通常就在这里。

推荐阅读