- A+
本文来自曹政大神的微信公众号【caoz的梦呓】,caoz的文章篇篇犀利,值得细读与收藏,特转载过来,分享给大家,如果你也喜欢,可以微信搜索“caoz的梦呓”来关注他。文章所有版权归原作者曹政所有!
找到这么有代表性的图片我都佩服自己。
好吧,最近12306的验证码已经被网民吐槽到爆,也成为段子手们的最爱,不过今天,虽然我是历史悠久的12306黑,但是今天,咱不讲段子,也不黑12306。
做点科普,为啥网民输入个东西,会冒出验证码,以及,验证码为啥会越来越变态。 懂这方面技术的同学也可以忽略本文。
技术背景的童鞋大概都知道,非技术背景的可能需要了解一下,验证码的目的,是将真正的人类,和机器区分出来,什么意思呢? 各种程序,模拟器,可以模拟人的行为,自动完成登录,购买等行为,这就带来了严重的问题,简单说有如下几项
第一,可能导致暴力密码破解和撞库攻击,攻击者可以通过程序高频次大量测试帐号密码的登录行为,如果攻击者通过彩虹库获得海量用户信息,可能导致目标系统的大量用户帐号密码被识别,导致帐号内资产失窃或重要内容泄露。许多巨头都面对过这个问题。
第二,刷票,刷单行为,对紧缺资源,秒杀,优惠券等内容,机器程序可以模拟人的行为快速海量的进行尝试,从而短时间内将这些资源一扫而空,导致正常访问人群无法购买或拿到这样的资源和产品。
实际上,服务端的验证程序,是无法判别,这个请求,来自于人类,还是另一个程序,那么,就需要有一种手段,来做这样的判别,除了一些常规的手段,(比如单一ip限制,cookie限制,基于统计规律的限制,但并非无懈可击),最常用的就是验证码,系统服务端生成一个验证码,让客户端以图片方式展示,人的肉眼识别并给出答案,服务端验证,从而摈除机器人的影响,保障系统安全。
但是,所谓道高一尺,魔高一丈,验证码最早是简单的图片数字,或图片文字,然而,强大的OCR技术早已看穿了一切,网上都有开源的验证码自动识别程序,(几年前玩页游的时候我就用过一段开源的代码来改进戴总的外挂程序绕过验证码验证,啧啧,不能再说了)。所以现在验证码就会变得越来越变态,越来越复杂。 不知道各位有没有注意,包括腾讯,以及谷歌,验证码的识别难度都特别巨大,每次都让我觉得自己老眼昏花感慨不已。
当ocr技术越来越牛的时候,验证码就开始出现了新的逻辑,比如,让你做一个数学计算,让你做一个多选题。 但是不是这样就可以战胜机器人呢? 很遗憾,依然不够充分。
ocr既然能识别数字和字符,加上一些定义匹配的特征,就可以识别一些计算符号,不管是数学计算符号,还是中文计算描述,哪怕是汉语拼音,都可以被识别并在程序中自动完成。
那么,如12306这样的验证码,是不是程序就完全没辙了呢。纯粹的程序,的确是这样,然而,对于有心的开发者而言,此事并非无解,简单说就是,程序+人力,穷举。什么意思呢?将所有出现过的图片通过人工识别打上标签(12306的验证图片不可能是无穷的吧,也不可能是随时更新的吧,只要图片是有限度的,更新是有时间周期的,那么就是有空可钻的),那么当标签和图片都入库后,程序就可以自动识别和选择。(当然,可能图片出现的时候会随机加一些水印或其他处理防止程序识别,但过滤这些处理的程序也是有的,问题是目前不确定12306是否有这样做) ,一次人工识别的成本,刷票程序就可以正常工作了。 这样就存在一种可能性,就是这种变态的验证码,到最后,防了君子,却很可能依然防不住刷票工具。
其实说来这事12306的确有点冤枉,因为去年几个互联网公司各个宣称自己实现了刷票插件,大家集体轮奸12306,不但人为加剧了订票网站的系统负载,而且也带来了订票的不公平性。今年这趋势,看来12306依然在劫难逃,所以,只好出此下策,但我的判断是,机关算尽然并卵,反而被各路网民和段子手讲个没玩。
那么,区分机器人,是否真的无解,或者真的难于上青天呢?
这是今天的开放性问题。
其实我还遇到过一些设计不错的验证码,比如,提供了一个可以拖拉的小button,提示拖到指定位置。 比如,一个简单的小拼图游戏,让你完成正确组合。但是,是否就能够规避程序的识别?我个人认为,依然不是很有把握。识别人与机器的工作,依然是一个特别艰巨的任务,而且随着人工智能技术的发展,这个任务可能会越来越难,兼顾用户的操作顺畅性和对机器的过滤,也会格外的艰难。
在无法彻底规避机器识别的情况下,常见的可行策略是,增加用户的输入成本,来减少机器人的比较优势。
比如说,时间成本,让用户必须等待10秒才可以输入,而服务端也会校验界面展示和输入完成的确认时间(服务端必须校验,否则就只过滤了正常用户,而放过了刷票用户),可以有效防止黄牛刷票(输入成本变高,但不能杜绝)。
比如说,短信验证码,同一个手机一分钟内只能收一份预定短信,但据说目前存在一些可以大量申请更换垃圾手机号码的软件,不确定是否可行。
有更好的设想,也欢迎留言。 至少目前,我看到的是,google还在用变态的验证码考验我的视觉。(多次密码输入错误后出现,在兼顾用户正常操作和防止机器人之间寻求平衡)
另外,目前基于人体特征识别的方式已经出现,但是普及难度似乎还是有点大,(嗯,不好意思,写到这里必须插播一句yangcong.com,如果你非认为我写了半天就是为了这句广告,我也没辙。) 但目前还没有谁敢把业务所有的验证全都放在上面,所以,目前这还只是一个值得关注的方向。
如何在兼顾用户易用性的同时,快速有效识别程序和人类的行为,是一个行业经典难题,其应用场景不仅仅是12306,还包括邮箱(撞库),微博(撞库),即时通讯(撞库,外挂工具,刷状态工具),电子商务(秒杀,限购,刷优惠券),以及游戏(很多原本很好的游戏策略被外挂玩死,这种案例数不胜数)。 谁能有完美思路彻底攻克这个问题,我个人认为,值得一个图灵奖。