验证码及其它


verifyCode.jpg

事出有因

PS:第一次给博客配个图,哈哈,庆祝一下,奖励自己一个芥末豆,不要怀疑自己的眼睛有问题或者屏幕不清楚,这个图只是高斯模糊了一下。

有些日子没有更新博客和它的代码,今天打开后台一看,我了个去,垃圾评论一堆,看来拖了好久的验证码必须得奉上了。倒腾了一会加了一个计算十以内的四则运算,这应该能防住绝大部分的垃圾评论,我也肯定我这个博客还没有大到值得有人取到这个表达式再计算再发送的地步。

先来吐糟一下在我的博客上疯狂发垃圾评论的这个机器人,这是一个相当的2B的机器人,一般来讲,发垃圾评论的目的都是推广评论内容中的链接,提高外链,或者直接引诱点击(需要支持html),这个机器人傻就傻在发的链接根本不可点击的嘛,并且发的时候连IP都不带换的,还在不停的发,这在精准营销已经深入人心的年代显得太不专业了。

当然它的好处就在于触发了我对验证码的一些思考和总结,趁着这个热乎劲,写点关于验证码和它相关的一些事情

各种各样的验证码

相信混迹于互联网的朋友们对于验证码一定非常熟悉,通常情况下它是个图片比如下面的

支付宝的验证码

也有下面这样带点花纹(专业点可以叫防识别噪音)

人人网验证码

也有在你输入验证码的时候就做为人类文明做好事的reCAPTCHA,不要怀疑,有些时候你确实有这么伟大

reCAPTCHA.jpg

也有精明且操蛋的把验证码放入广告的,如下,具体的可以看一下某国内某知名下载站

广告验证码.jpg

还有向你手机发送短信的验证码,经常使用支付宝网购的朋友这个应该很熟悉,特别是当你点了发送验证码的时候,过了好久好久,短信都没有收到,有没有一种对这个码产生非常强烈的厌恶的思想感情?我懂你的,因为我是经常收不到

短信验证码.jpg

验证码出现的原因

引用维基百科

全自动区分计算机和人类的图灵测试(英语:Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),俗称验证码,是一种区分用户是计算机和人的公共全自动程序。在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

一句话,验证码就是为了判断当前操作者是不是人。手机短信验证码更多的是为了判断操作者是不是本人。

举个栗子:某网站A有大量的用户,一个小网站B用户量不是很多,小网站B想在网站A上做宣传推广,这时候B有可以选择网站A的广告服务,也可以选择花钱购买或者自己编写程序在A网站上大量发信息。选择广告服务,意味着这是一个长期性的消耗投资,选择代码则是在A网站不升级的情况下的一次性投资,并且两者之间巨大的金钱差距也会使很多人选择程序的方案,验证码就是为了防止程序的情况。

验证码前后的技术细节

验证码的程序逻辑并不复杂

  1. 客户端请求的时候服务器生成一个验证码,以某种格式(通常是图片)返回一个跟这个验证码相关的东西,同时服务器端有一个标识对应此次请求的客户端。

  2. 客户端接收到图片,用户识别,并且输入

  3. 客户端再次请求时带上用户输入的验证码,服务器收到这个码,并取到客户端标识,以此标识找到服务器端的码并与客户端发来的码对比

这个唯一标识在服务器端和客户端的解决方案通常是Session,客户端对应的是一个session_key,一般以cookie的形式存在。

验证码的攻与防

验证码相当于是服务器的一个盾,用来挡住机器人(程序),当然盾也有挡不住的时候。

我们假设有一个4位的数字和大小写字母混合的验证码,它是很规律的一个字符一个字符排开的,这个就是最好破解的

  1. 取一个验证码图片,按照一个字符一个字符的宽度拆成4份,每个小图片对应一个字符
  2. 重复步骤1,直到取到所有的0-9、a-z、A-Z的所有字符的所有图片
  3. 步骤1和步骤2完成了,就相当于我们知道了所有字符的样子,接下来就是对比,下次再取得一个验证码,我们就先拆,然后用已经知道的字符图片去逐个对比,最终就能知道这个图片对应的字符是什么

以上是一个最简单的验证码破解思路,专业点叫模板匹配,当然这个防起来也最简单,首先生成图片的时候每个字符旋转一定的角度,同时字符之间的宽度不固定,再加上各种噪音小条纹上面的思路基本上无法破解。

例如这个

人人网验证码

它就无法破解了么,别怕,我们有非常NB的技术,并且这个技术是一个很正面的很阳光的技术OCR,这个再详细点我也不懂,相当专业,已经有一些开源的库可供调用,但是这个识别也经常出问题

那么好吧,有终极大招,人肉识别法。在考虑时间成本和收益允许的情况下,可以真人上阵,一个表单别的项由机器输入,仅仅是在验证码的时候由人工输入,这样验证码也是无能为力了。

更好的验证码

让我们来回归验证码的初衷,它是为了保证当前操作是真人,一些情况下需要是本人,当前的这些验证码确实能够保证,但是它们足够好吗?首先来说一下reCAPTCHA,它确实是在做好事,但是我一直觉得它很难用,多次给我的图像是我完全识别不了的,我也很为我的智商捉急,但是你不能让我卡在登录处啊;然后是那个操蛋的广告加验证码,本来用户是想快速结束这次操作的,它倒是不紧不慢,分秒必争的放广告,这样不是惹来反感么?我向来觉得广告是应该放在无聊时间段和它该出现的时刻,比如等电梯时,而广告验证码这种在拦截操作时放广告的行为2的很彻底。

最好的验证码应该是不用验证码,如果有更好的身份认证技术手段,比如语音识别或者做一某个动作识别,那验证码甚至用户名密码都没有存在的必要了。


推荐文章