什么是验证码?它是如何工作的?每种类型详解

验证码是网站用来区分真人与脚本的一种测试。如果你点过“我不是机器人”、照着图片重新输入过扭曲的字母,或选出过所有含红绿灯的方格,你就完成过一次验证码。其中很多你从未察觉,因为现代验证码在后台判断,只有在发现异常时才会打断你。
那么验证码在实际中到底是什么?下面介绍这个缩写的含义、你真正会遇到的六种类型,以及每一种是如何做出判断的。
CAPTCHA 是什么的缩写
CAPTCHA 是以下短语的缩写: 全自动区分计算机和人类的公开图灵测试。名字很长,道理却很简单:出一道人类觉得容易、而软件觉得困难的题目。
“对软件来说困难”的这一半始终在变。扭曲文字题目在 2003 年确实让机器很难应付。后来字符识别技术追了上来,于是测试转向图片,再转向行为,最后发展到什么都不显示就直接给你打分。每一代的出现,都是因为上一代已经失效。
你真正会遇到的六种类型
网络上几乎每一个验证码都属于其中之一。
1. 文字验证码
图片中扭曲的字母和数字。你照着看到的内容重新输入。它是最原始的形式,且正在式微,因为字符识别如今已能很好地处理它。你仍会在较旧的论坛、老旧的政府门户和内部工具中遇到它。以程序方式读取它,正是 图片验证码识别工具 却能做到。
2. 图片选择
一个图片网格加一条指令:选出公交车、人行横道、自行车。这就是大多数人一听到验证码就会想到的形式。它通常是 reCAPTCHA 在升级验证,因为该请求的某些特征看起来已经像是自动化操作了。
3. 复选框
“我不是机器人”复选框。点击本身几乎证明不了什么。真正重要的是围绕它测量的一切:光标如何移动到位、浏览器是什么样子、该 IP 最近在做什么。通过了,你就过关;失败了,你就会看到图片网格。
4. 隐形(Invisible)
同样的机制,只是没有复选框。验证会在页面加载或表单提交时触发。大多数访客根本看不到任何东西,只有当信号较弱时才会出现挑战。
5. 基于评分
全程没有任何题目。系统会返回一个数值,用来估计该次交互看起来有多像真人,再由网站决定如何处理:放行、挑战或拦截。这对访客更友好,但对实现方来说工作量大得多,因为阈值逻辑现在由网站自己掌控。
6. Cloudflare Turnstile
Cloudflare 的替代方案,旨在以尽可能少的可见交互完成验证。它以表单中的小组件形式出现,或在运行挑战时以整页插页式拦截的形式出现。我们关于 Cloudflare Turnstile 的页面介绍了这两种模式在实际中的区别。
你可以在我们的 验证码演示页面.
验证码是如何做出判断的
在页面中,一个验证码通常由一个容器元素和一个脚本组成:
<!-- A reCAPTCHA v2 checkbox: one div, one script. -->
<div class="g-recaptcha" data-sitekey="YOUR_SITEKEY"></div>
<script src="https://www.google.com/recaptcha/api.js"
async defer></script>
<!-- On success the widget writes a token into a hidden field
called g-recaptcha-response, which posts with the form. -->可见的题目(如果有的话)只是最小的一部分。在它背后,服务商正在权衡一系列你从未直接接触的信号:
- 鼠标移动、滚动和打字节奏
- 浏览器和设备特征
- 来自该 IP 的请求有多少,以及它们都做了什么
- cookie 以及与该服务商的历史交互记录
- 时间特征,例如表单提交的速度快到常人根本来不及阅读
随后,结果会以一个 token的形式传递。小组件会向你的浏览器交付一个短时有效的字符串,表单将其提交,网站的后端再用这个 token 向服务商核验,以确定你是否通过。任何判断都不是在你的浏览器中做出的,这就是为什么修改页面永远无法让你蒙混过关。
网站为什么使用验证码
因为自动化滥用既廉价又快速。在一个人填完一次表单的时间里,一个脚本就能向表单发起成千上万次请求。如果前面没有一道检查,小网站和大网站一样容易遭殃。
常见的攻击目标:
- 通过联系表单和评论表单发送的垃圾信息
- 虚假账户注册
- 针对登录页面的撞库攻击
- 抓取内容、价格或商品列表
- 滥用免费试用、优惠券和赠品活动
- 抢购结账和囤积库存
验证码并不能让这些行为变得不可能,但它能把成本抬高到足以让大多数投机取巧的尝试知难而退。
验证码为什么让人恼火
因为代价落在了每一个人身上,而不只是机器人。以下是常见的抱怨,且都合情合理:
- 无论你怎么点,图片网格都在不停地重新加载
- 文字扭曲得根本无法辨认
- 挑战在每个页面都触发,而不只是在有风险的页面
- 对 VPN、共享办公 IP 和隐私浏览器的误判
- 对屏幕阅读器和运动障碍人群支持不佳
这就是真正的权衡。把防护调得越严,你挡住的滥用越多,同时挡住的客户也越多。这正是行业不断转向隐形和基于评分检查的原因:在提供同等防护的同时,尽量少去针对那些本来就不构成问题的人。
验证码只是其中一层,而非整套防御
现代反机器人体系很少只依赖验证码。围绕它的还有限速、IP 信誉、浏览器指纹、设备检测、行为分析和会话监控。
这就是为什么使用同一提供商的两个站点表现却截然不同。提供商给出一个信号,而每个站点设定自己的阈值,以及对“弱信号应付出多大代价”的各自答案。
这也解释了那种令人恼火的不对称:在同一网络连接下,一个网站直接放你通过,另一个却接连给你四个图片网格。
常见问题
用简单的话说,什么是验证码?
这是网站用来判断访客是真人还是脚本的一种测试。它可能是一道题、一个复选框,也可能是你从未察觉的后台静默检查。
网站为什么使用验证码?
为了减少垃圾信息、虚假注册、暴力破解登录、网络爬虫及其他自动化滥用行为。它的原理是让每一次尝试都付出一定成本,从而使大规模自动化不再廉价。
验证码主要有哪些类型?
文字、图片选择、复选框、隐形、基于评分,以及 Cloudflare Turnstile。前两种会给你出一道题,其余几种则主要或完全依据你看不到的信号来做判断。
验证码总是可见的吗?
并非如此。隐形和基于评分的系统在运行时不会显示任何内容,只有当请求看起来可疑时才会弹出挑战。如果某个网站让你觉得它没有验证码,也许只是因为你一直在顺利通过。
验证码能挡住所有机器人吗?
不能,它本来也不是为此设计的。它抬高了自动化的成本。有决心的攻击者仍能突破,这正是为什么它要与限速、指纹识别和信誉检查配合使用,而不是取而代之。
小结
验证码是横在访客与某个操作之间的一道廉价过滤器。可见的题目只是其中很小的一部分,围绕它的各类信号才承担了大部分工作,而结果会以一个你的浏览器无法伪造的 token 的形式传递。六种形式几乎涵盖了你会遇到的一切,而趋势正坚定地转向那些你永远看不到的类型。
Google 的实现是你最常遇到的一种,我们在 reCAPTCHA 是什么及其工作原理中对它有专门的讲解。如果你身处另一端,需要在爬虫或测试套件中处理挑战,请参阅 网络爬虫中的验证码处理。CapSkip 本身是一个 无限量验证码识别工具 在你自己的机器上运行。
