[验证码辨识技术]-初级的滑动式验证图片辨识
优采云 发布时间: 2020-08-13 11:10初级的滑动式验证图片辨识方案1 abstract
验证码作为一种自然人的机器人的判断工具,被广泛的用于各类避免程序做自动化的场景中。传统的字符型验证安全性早已名存实亡的情况下,各种新型的验证码如雨后春笋般涌现。目前最常见的一种方式就是“滑动拼图式”
关键字:验证码,图灵测试,图像辨识,python,破解
2内容概述
关于滑动式验证,最早由国外某网路安全公司首次提出的行为式验证,以滑动拼图解锁的形式呈现在世人面前。然后大约过了好几年以后,各种各样的滑动式验证产品都下来了,那么这种看似一样的产品,它们的安全性究竟怎样呢?
本文特意选购出了一些后来者的小厂商的滑动式验证来做下实验,仅从第一步的图像学上剖析一下安全性。因为我的主技术路线是图像学,关于后端的js并不熟悉,所以就只在图像学上点到即止即可。仅供会一些自动化技术的朋友提供一些知识补充吧。
由于研究的实验对象实在是很简单,所以本文涉及的一些图像学的知识也不难,基本上python的中级选手就可以跑通本程序。仅供你们学习学习。
3研究对象
某小站点上由小厂商提供的“滑动式验证”:
使用python写一个简单的爬虫自动化脚本,将此网站上的验证码资源多恳求几次,并保存到本地,观查图片特征。
一般情况下,这一步是必须的,多下载一些图片,很多规律是可以一眼看出的。比如,从公开的页面中,连续恳求此验证的资源100次,下载100张图片后。
一眼看上去,此验证的图片素材都只有一种模式,那么就放心了,因为这个问题就比较单一,而不是多模式下你必须要解决多个问题。
4定性分析
将这些单一模式的图片筛选一张下来,如下:
发现如下特征:
和后端展示相关的图片有:方块位置提示图A,小方块B,完整背景图C。A图完全是由B和C合成
显然,设计这个验证图片的人没啥安全方面的经验,有如下两个产品细节没有注意:
对图片没做任何的特殊处理对外公开提供了过多信息
于是促使辨识此图片的位置显得十分简单。
5定量分析
在上面一小节中,我们只是直观的见到了那些图片的一些非常,但是要解答这个题目,还须要进行量化,量化后才会程序化,程序化后才会全自动化。
使用matplotlib工具打开此图片。量化得到如下参数:
图片整体尺寸:w:240,h:450由上到下分为三部份,每部份高度为1506求解图片
很明显,只要将第一张图和第三张图相应的象素相加,神奇的事情就发生了:
“左上”减去“右下”就得到“左下”的结果。
这个时侯,对x方向的R通道的象素点进行累加统计。
得到如下的统计图:
然后对这个曲线求一阶行列式或则只要发觉有个突变值超过最大象素值的某比率时,即可得到最右边的那种y方向突变点的位置。
到此为止,此图片的位置早已成功解出。
下面是相应的python代码:
import numpy as np
def get_boundary(mask, axis, ratio=0.6):
"""
对灰度图的某个channel做像素统计
"""
sum_along_axis = np.sum(mask, axis=axis)
max_value = np.max(sum_along_axis)
bound_value = max_value * ratio
bvalue = (sum_along_axis >= bound_value).astype('int8')
return np.where(bvalue != 0)[0][0]
def get_predict_ans(img):
"""
根据分类出来的图像,找到相应的图像位置
传入二进制的图片,返回答案
:param img:
:return:
"""
nd_img = np.array(img)
w_pos = get_boundary(nd_img, 0) # 根据分布图找到边界位置
return w_pos
7最后总结
由于我不会后端技术,所以我的工作就到此为止。
但是后来有位会后端的网友研究了一下那种网站的验证码后端代码,据说其防护举措也只有图片这一层,只须要把答案放在http的插口上面上传,再加个时间标记才能稳稳的过了。然后借鉴本文解图片答案的思路,基本上可以达到:1s通过60次,成功率大约70%吧。
对滑动式验证有兴趣的朋友,如果大家想练手的,可以多去找一些新入场这个领域的厂商试试,基本上新入场的团队的就会犯一些特别低级的错误,但是请只是技术上在本地自己机器上跑跑试试,安全领域有风险,请自爱。
同时嘱咐一些自己想现今开始做滑动式验证码的厂商,如果投入不够还有相应的技术和产品积累不够,进入这个领域的时侯,请谨慎,因为你的不成熟的工作只会成为本系统最大的漏洞。