如何评价 12306 的图片型验证码? 俞金辉,招产品设计师、用户界面设计师 评价要结合目的。 验证码的目的是什么? 为了区分人类和机器,设计出「一个测试」,通过测试的判断为人类,未通过测试的判断为机器。 这就一方面要考虑如何让人类容易通过测试,一方面要考虑让机器难以通过测试。这就必须要利用人类和机器的差异。 12306 的这套验证码,是一套非常差的验证码:人类很难识别,机器很容易识别。 以人类的角度来说,在桌面上已经难以识别,更不用说在手机上了。 但是对于机器,却是相当的简单。在不涉及任何技术细节的情况下,我们也可以很明显地发现: 「请点击图中所有的小提琴」的「小提琴」关键词和图中的「小提琴」图像的对应关系,是由人标注的。(假设不是人标注的,而是由某种自动方法生成的,那么破解方也可以沿着这个方法去破解。字母数字类验证码是随机出的情况,就去掉了这种可能性。) 既然由人标注的,那么这个库就是有限的,而且不大。(不然,得花多少钱来雇人做这个库?) 既然是个不大的固定库,那么破解方就可以不断尝试,把所有的图片和关键词对应关系都穷举、人工标注出来。 然后使用这个库去破解就可以了,识别出句子中的关键词,然后从库中找到对应的图片来比较,选择一样的图片即可。(如果为了避免这样的比较,对图像加上扭曲、干扰,那人就根本看不清了。)(如果为了避免关键词识别,对关键词加上扭曲、干扰,破解难度和以前差不多。) 人工建库标记是个体力活,但是一劳永逸啊。 12306 没有办法频繁来更新验证码,这套验证码他要用好久。通过这个例子,我们可以发现,所有人工标记结果的有限库,都可以使用穷举建库方式来破解。 设计验证码时候,要避免从人类识别的方式去判断破解的难度。当然这套验证码的设计者,可能认为:「人都看不清了,机器还能看清吗?」,也可能认为「这个看上去很难,忽悠 12306 足够了~」(面向甲方,达成了目标)。 为什么验证码容易被破解? 当然,以上只是一种破解方法。如其他用户所示还有使用 Google 等的图片识别方式来做。可以发现,破解方有好多种可利用的工具。这是验证码不断升级的一个原因:世界上有非常多的科研就够、公司在做(有变形、干扰的)图像识别研究和产业化。这些研究,来源人类生活中的需求和人对未知的好奇。人类一直在研究让机器能够做人的事情,这个方向和验证码的目的天然是矛与盾,正好被用来破解验证码。 那有人会说,那些黄牛有这么强的实力吗?他们不需要有,他们只要有钱,就可以雇人来破解。不同网站有不同的验证码,破解一个网站的验证码可以卖给很多家有作弊需求的人。因此,破解验证码的需求,可以让一部分人专心做验证码破解方案来赚钱。愿意花钱来买破解方案,那当然不能做亏本生意。其根源还是在于有利可图,而且利益足够大。 既然验证码想要判断是不是人,那可以雇人来做救兵。 有利可图的时候,如果机器破解不了,当然还可以出钱请人来输入验证码。网上大量广告,找人兼职输入验证码,他们每天花时间利用破解方提供的工具输入 12306 等网站的验证码(「打码」)。 所以,到这个程度,就算验证码能够区分出人类与机器,也不能够挡住为利所惑的人类了。有钱能使鬼推磨。 以上说的是你所见到的「验证码」,比如出一道题,你做出来了,就认为是人类,做不出来,就认为是机器。 一种趋势:不只看结果,还要看行为。 实际上,就算你做出来了,仍然可以通过分析你是怎么做的,来判断是不是人类,比如:Google 的 reCAPTCHA ,阿里巴巴的拖动滑块验证码( 阿里的“拖动滑块验证”是怎么实现的? - 计算机网络),极验验证(极验验证可以被破解吗? - 互联网)。给用户一个简单的动作任务,然后分析用户动作过程中的大量数据。机器可以模拟这些数据,但是难度有可能比传统验证码,也更容易更新升级。 留一个疑问:那么能不能判断出是正常用户还是「打码」的人么? 验证码这么烦,能不能去掉呢? 以上「行为」类验证码替换了传统验证码,虽然广义上还是「验证码」,但是体验上好了很多。 那么,能不能更进一步,把这个也去掉呢? 验证码的初衷是判断是人类还是机器。那怎么判断呢?给你出个题,出个任务,看你是不是做出来了,看你是怎么做的。形成固定思维时,往往忘记了验证码的初衷,关注与这个题 / 任务的难度,不断改进这个题 / 任务。 如果回到问题的本源,肯定有更多的解决思路。 其实大部分做验证码的人都会想一个问题:什么情况下要出验证码?——怕被机器刷,所以要做个验证码挡住,怀疑这次操作是机器刷的,所以出个验证码判断一下。 换个角度,就是我们不给用户出题 / 任务,是否可以尽量从他之前有的行为来判断呢?在很多场景下,这是可行的。比如在登录环节,用户在看到写验证码之前,需要填写帐号和密码等信息,在这个行为中,我们就可以判断他是不是人类。逆向来说,就是用户填写帐号、密码的过程当可以做一个「题 / 任务」,一个「验证码」。这样就省掉了显式的验证码。 本身,业务是要判断什么时候出验证码的,在这个方面可以有更多的努力,即完成了验证,又让用户尽量少地看到验证码。即我们尽量使用用户已有行为做判断,如果还不够判断呢,就加一个题 / 任务(所谓验证码)。这也就不难想到,最后我们可以结合验证码的结果和行为数据以及非验证码的行为数据共同判断,而不是把所有的判断压在验证码这一个题 / 任务上。 12306 验证码的初衷是什么? 是为了防止黄牛吗?——在目前的利益空间下,最没有技术含量也可以通过雇人打码的方式来,甚至不走普通用户的购票流程,完全不受验证码的影响。 ——防止黄牛,需要减少获利空间(方法是有的,比如身份证、手机限制、车票限制、内部监管等角度。) 是为了防止刷票插件吗?——刷票插件背后是各大公司,完全有能力快速研发破解方案。 ——防止刷票插件,可以禁用(如发现使用刷票插件的帐号,24 小时内禁止购票) 是为了防止避免系统挂掉吗?——很好地阻滞了购票行为,可以达到部分目的。 ——防止系统挂掉,可以分散流量(比如春运的车票分批售票,越晚购票,票价越贵;越靠近春节的票,票价越贵等) 结合这个问题,抛砖引玉,聊一聊验证码,小结一下: 12306 的这套验证码,是一个巨差的验证码; 验证码容易被破解,因为人类一直想让机器能做人的事; 验证码为什么防不住「作弊」,因为有钱能使鬼推磨; 验证码的一种趋势不限于结果,增加行为分析; 应该尽量利用用户自然发生的行为数据,减少验证码; 做验证码,最关键还是要记住初衷,突破局限。 查看知乎原文