12306被喷谁受益?带着正能量重新设计12306防黄牛购票机制
(纯个人分析,希望各位大咖给予意见,我会继续完善感谢~)
春运将至,大家都非常关注 12306 的抢票,验证码和手机验证也成了段子手和喷子们争先恐后调侃的对象,先来看看 12306 是如何被黑的:
不得不佩服各位 P 图大神的功力,这样黑 12306 真的好吗,容我先擦一下鼻血~
网络水军是这样调侃 12306 的:


(以上图片据来自网络)
那么从引发这个问题的验证码说起,12306 验证码的变迁分为以下几代:
简单数字——数字加字母——加减法算式——闪烁变形字母动态码——中间添加干扰线的变形字母——图形验证码
配图如下

简单数字 (好吧这是 PMCAFF 的验证码找不到原始图片了)

数字加字母验证码 (机器真的很难识别吗)

动态图片验证码 (非常短命防不了机器只能防止人类)

图形验证码万众吐槽版本
第一个验证码是最常见,很多网站都在用,毕竟没有需求就没有必要做多么高级的功能。于是我们聚焦 12306 的需求,在购票方面, 从最重要紧急到不重要不紧急排序如下:
防止售票员舞弊(我没有事实根据,但知乎和头条很多人说)
实名认证(包括身份证、手机号)
防止黄牛大量囤票(就是以前在车站的时候,一个人天南海北的胡买一通票)
防止黄牛通过人力囤票
防止黄牛为其他人代购票(也就是现在的刷票,人工在 12306 代购那不叫做黄牛)
建立良好的公众形象
仔细想想,图片验证码的作用就是用于刷票的,那么为什么不是用于防止黄牛大量囤积或者用于防止黄牛用自己的账号买票呢,因为图片验证码有一个概率,根据现在的验证码规则,在 8 个图中选择 1~3 个图,那么随机选一个选中的概率就是:

应用一下中学排列组合知识,C 表示组合数
概率是 1.086%也就是说黄牛买 100 次票就会有 1 次抢到票。这一点对普通用户来说是毫无作用的,一般的用户就算用刷票软件 100 次才能有 1 次过验证码,抢票成本太高了。但对于大量囤积票黄牛贩子来说这个概率足矣。使用一个机器 100 次能过 1 次,那么使用几十几百个机器抢,就可以想囤积多少就屯多少了。而验证码用来杜绝黄牛拿自己的账号人力屯票也是行不通的,黄牛人工操作,你总没办法吧,人力屯票,就像以前的黄牛都是到火车站排队去买票一样。
针对这几点,我们应该怎么样设计才能防止呢,一点一点来说:
一、实名认证
这是一个很大的课题,不要想当然的认为很容易。在足够的利益面前,信息是可以伪造的,而我们还不能过分的追求唯一性。
举个例子,比如有人说 “IP、MAC、序列号、操作系统…重复就视为是一个人且只能买一张票”。这怎么可能 o (╯□╰) o~~ 难道就不允许换一个电脑了嘛,难道就不允许中转换乘了嘛。还有人说,手机号验证了就可以解决实名认证问题了。我只能说 too young too simple,网上有那么多代发代收短信的渠道,用假手机号过手机验证码根本不是梦😄。
仔细梳理一下,实名认证主要是几点:身份证验证、账号的手机号验证、账号与真人对应的认证。
身份证的验证:目前是无法完全杜绝的,无论何种情况下,黄牛总是能弄到真实或者伪造的身份证,身份证识别也是无法准确验证的 (也许若干年后,可以再身份证上弄一个像银行密保、网游盾一样的东西,但那一天还远远没有到来)。那这怎么办呢,我也不知道😄。我只好研究了一下 12306 的预防机制,发现一个身份证添加在某处之后在 180 天之内不允许删除,身份证添加有一定的上限。这应该是一个为了打击黄牛的功能,如果各位有啥更好的想法,可以在下面留言一起讨论哦~
手机号的验证:不知道大家是否知道在滴滴、快滴出台新用户补贴时同时,就出了一大批来代收发验证码的平台,这些平台就是为了给用户在没有手机号的情况下,可以注册很多很多很多账号。这一问题也很难解决,总不可能让电信提供一个所有真实手机号码的数据库吧。就算 12306 和电信移动都是国企可以合作这也很困难,甚至电信自己也没有这么一个数据库。反观 12306 还是可以的,其实,现在的这种主动发短信的方式 虽然有点漏洞,但也总比没有好多了。
最后就是账号和真人对应: 大家肯定和我一样还是完全没有想法,这已经是超出时代的课题了~ 最多就是用验证码是去勉强的区分一下傻的机器和真人 (包含聪明的机器)。
二、 如何防止黄牛大量囤积票
这一点还要从概率的方面考虑。任何验证策略总是有一个成功概率的,只要有足够大的基数,那就一定能达到预期的成功数量。最直接的应对方式就出现了,就是单客户端、单账号、单个手机号在一定的时间段有一定的访问次数上限 (如一个小时或者一天内查询的次数设置一个限制,这个限制可以考虑根据时间段的长度来决定限额大小)。一般的产品这么做是没必要的,但是对于 12306 却十分有必要,限额是最不容易被用户感知到的功能,也是我最推荐的方案,最好的策略就是能润物细无声的只对大量刷票的用户做出一定的限制,让普通用户有一个好好买票的机会。
三、 如何防止黄牛人力囤票
在这一方面来说验证码也是毫无用处的。因为人工买票也是一个很好地囤票手段。在农村招一批年轻的小伙子,找一个黑网吧,经过半天的培训做抢票的工作肯定毫无问题了。一整天人工刷票来囤积,有客户没票着急买的时候加价 20%~80%卖给他。找个人少的时间 (以前可以凌晨买票,黄牛的账户先退票,客户账户再买,这就完成了票的转移)。针对这一点,最基本的防御方法就是实名购票,但这还不够,还有:
一个账户不能购买的来回区间过多,(比如限制 15 个始发站、终点站组合),或者可以要设置家乡地和工作地,买去这两地或从这里出发的车票会比一般客户容易 (春运期间回家肯定是头等大事,别的就放放再说吧,总不可能你出去旅游玩比人家回家看望父母要重要吧~)
有一个策略经常被提到,就是要按照身份证限制买票时间 (实际上这个功能有一段时间上线过)。我觉得这是超级不靠谱的需求,大家难道没想过如果身份证丢了被卖到黄牛手里,黄牛加上了验证然后买了一把票,等到你自己买票的时候网站提示你: “ 你已经有票了,别老买票!"这是什么感觉吗?到时候那真是叫天天不应、叫地地不灵了。
退的票不是立即就可以买票而是所有退票都统一时间处理。比如 3 天前退的票都在发车 3 天前的某一个时刻放出,3 天内的票就当日或次日 12:00 放出,这样黄牛就没法偷偷地把票转移到客户手里。(这个功能 12306 在着手做,退票已经不是马上出票了)
四、如何防止自动刷票
好吧这是最麻烦的。换句话说,就是如何让不同用户公平的抢票,而不会因为有了某种工具就比别人容易抢票,甚至不会因为手慢就抢不到票 (当然这个很难)。
到了这里黄牛囤积的概率应该已经大大减小了,如果能把这一步也禁止了,那么黄牛应该就只能回到最原始的方案 (也就是带着乘客从出口往里跑,硬生生摸进去)。到这里图片验证码才开始登场,这也是秒杀方案要考虑的地方。图片验证码的作用就是防止机器能在开抢 0.1s 之内就买到票了。普通用户要 2~4s,如果机器不能快速识别图片验证码,那么加上验证码之后所有人的反应速度都在 4~10s 左右,这就公平了。当然验证码是永远防不了机器的,不考虑机器直接识别的情况,有一个方案叫做人工打码,机器调用一些人工打码接口,不过速度不快,刷一天也许才能弄到票。这速度和普通人差不多,也算是做到了基本公平。
五、开一下脑洞欢迎小伙伴们一起开脑洞哦~
那么我们有没有什么代替验证码的方案也能让机器出局,大家都比较公平呢?接下来就是脑洞大开的时候:
既然要公平那么可不可以这样考虑,一批车票不一次性放出来而是考虑在一个小时内分 15 次,放出来每次都是一个小的"抽售",在这 4min 内只要申请一下,在放票的时候就可以参与抽奖。抽中了就获得了有 45min 锁定时间的票。在一个小时放票时间没抢的票就继续按照现有逻辑呗~
大量买票的用户群体其实很有限,只有少数是经常出去玩的用户,那剩下的呢?一些是黄牛,还有一些是某哪儿等等之类的网站 (很多时候 12306 没票,在某哪儿就有)。那么这样的用户可以采用严格的验证策略。这是一个烟雾弹 (采用了严格的策略又不提示),这样会让他们以为整个网站都很严格,可以为等多优化争取到时间。
开放第三方接口,允许其他平台查询而不是抓取,允许登陆后预约票。这样可以减轻很多开发压力和舆论压力。现在这么多购票软件和购票浏览器,一下都给弄死了这得引起多大的反弹。为了防止这种情况可以考虑给个接口引导这类 app、 浏览器转型给个生路大小都好过年。
六、建立良好的公众形象
其实现在 12306 做的还是挺良心的,界面清晰、功能基本没有 bug。出了个高级一点的验证功能——图片验证码却被黑出了新的巅峰,其实仔细想一下就知道此举旨在也是保证大多数人的抢票权益。12306 目前主要是和黄牛作斗争,这是他的命门,只要能让用户买到票,这就是好的用户体验!其他都不重要。也别总说 12306 拿钱不办事、职工傻,给阿里就肯定能弄好,这根本不可能的,不办事的国企早就都倒闭了,扯淡的人请先用一下脑子。
另外不知道大家有没有想过一点,为什么一个图片验证码会引发这么多吐槽,难道真的因为选 C 罩杯或者一排头像选矮子的验证码的出现的非常多? 不知道大家是否还记得校车事故发生后引发强大的舆论谴责。也许大家认为谴责过后山区的人们从此就过上了幸福的生活……可事实却是,经过这场声势浩大的舆论谴责后,不靠谱的小面包校车直接停运,结果就是山区学生上学负担变得更沉重了: 他们要么选择放弃读书了,要么就是父母一方放弃赚钱凌晨 4:00 骑摩托车走十几公里的山路去送孩子上学。请问大家的谴责是否真的帮助到了山区的小孩,谁才是真的受益者呢?(其实受益人就是在山里办所谓希望小学骗赞助的人,当然这个也许只是子虚乌有)
同样的事例不甚枚举,还有 60年 左右以前的韩国。当时韩国准备自己办奶牛养殖行业,因为国内牛奶行业进口量超高。这时候主要出口国美国就不乐意了,于是就开始化做良知,操心起了韩国人民的身体健康,开始说韩国的奶牛卫生不达标、会有害健康。当时的韩国总统坚持自己办养牛业,然后就在舆论的压力下就下台了。最后韩国国内养殖业倒闭,舆论造成的结果就是: 国内的牛奶等价格翻了好几倍 (这不废话,垄断加海运肯定比本地的贵呀) 这件事情受益的又是谁?
最后补充一个事例,知乎上看到的,具体记得不是很清楚了。是说某国石油原本是垄断,后来迫于舆论压力市场化,结果质量暴降,接着就引发合格石油价格大大上升 (这肯定的吧,石油需要大规模设备才能生产处优质石油)。这个收益的人是谁就更不知道了。
现在看来 12306 的事情和以上三个案例都非常像,如果 12306 真的迫于舆论压力做不下去了,铁路市场化。那么受益人又是谁?反正我觉得不是我!(当然啦,这事也轮不到我说,大家看看前面的产品分析部分就好了)。
我是PMCAFF的程序猿,现在应鼓励师 夏然 的邀请,就整理了一篇文章出来。本文由 PMCAFF 产品经理社区作者 @lin 原创,未经允许禁止转载。