Python实现图片滑动式验证识别方法


Posted in Python onNovember 09, 2017

1 abstract

验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情况下,各种新型的验证码如雨后春笋般涌现。目前最常见的一种形式就是“滑动拼图式”

2 内容概述

关于滑动式验证,最早由国内某网络安全公司首次提出的行为式验证,以滑动拼图解锁的方式呈现在世人面前。然后大概过了好几年之后,各种各样的滑动式验证产品都出来了,那么这些看似一样的产品,它们的安全性到底如何呢?

本文特意挑选出了一些后来者的小厂商的滑动式验证来做下实验,仅从第一步的图像学上分析一下安全性。因为我的主技术路线是图像学,关于前端的js并不熟悉,所以就只在图像学上点到即止即可。仅供会一些自动化技术的同学提供一些知识补充吧。

由于研究的实验对象实在是太简单,所以本文涉及的一些图像学的知识也不难,基本上python的初级选手就可以跑通本程序。仅供大家学习学习。

3 研究对象

某小站点上由小厂商提供的“滑动式验证”:

Python实现图片滑动式验证识别方法

使用python写一个简单的爬虫自动化脚本,将此网站上的验证码资源多请求几次,并保存到本地,观查图片特点。

Python实现图片滑动式验证识别方法

一般情况下,这一步是必须的,多下载一些图片,很多规律是可以一眼看出的。比如,从公开的页面中,连续请求此验证的资源 100次,下载100张图片后。

一眼看上去,此验证的图片素材都只有一种模式,那么就放心了,因为这个问题就比较单一,而不是多模式下你必须要解决多个问题。

4 定性分析

将这种单一模式的图片筛选一张出来,如下:

Python实现图片滑动式验证识别方法

发现如下特点:

和前端展示相关的图片有:方块位置提示图A,小方块B,完整背景图C。

A图完全是由B和C合成

显然,设计这个验证图片的人没啥安全方面的经验,有如下两个产品细节没有注意:

对图片没做任何的特殊处理

对外公开提供了过多信息

于是使得识别此图片的位置变得极其简单。

5 定量分析

在前面一小节中,我们只是直观的看到了这些图片的一些特别,但是要解答这个题目,还需要进行量化,量化后才能程序化,程序化后才能全自动化。

Python实现图片滑动式验证识别方法

使用matplotlib工具打开此图片。量化得到如下参数:

图片整体规格:w:240,h:450

由上到下分为三部分,每部分高度为150

6 求解图片

很明显,只要将第一张图和第三张图相应的像素相减,神奇的事情就发生了:

Python实现图片滑动式验证识别方法

“左上” 减去 “右下” 就得到 “左下”的结果。

这个时候,对x方向的R通道的像素点进行累加统计。

得到如下的统计图:

Python实现图片滑动式验证识别方法

然后对这个曲线求一阶导数或者只要发现有个突变值超过最大像素值的某百分比时,即可得到最左边的那个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

总结

以上所述是小编给大家介绍的Python实现图片滑动式验证识别方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python使用in操作符时元组和数组的区别分析
May 19 Python
浅谈Python中列表生成式和生成器的区别
Aug 03 Python
Mac 上切换Python多版本
Jun 17 Python
Pipenv一键搭建python虚拟环境的方法
May 22 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
Jun 27 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
在cmd中查看python的安装路径方法
Jul 03 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
python not运算符的实例用法
Jun 30 Python
你需要掌握的20个Python常用技巧
Feb 28 Python
浅谈python中的占位符
Nov 09 #Python
速记Python布尔值
Nov 09 #Python
浅谈python jieba分词模块的基本用法
Nov 09 #Python
基于python中pygame模块的Linux下安装过程(详解)
Nov 09 #Python
python中Switch/Case实现的示例代码
Nov 09 #Python
在Python web中实现验证码图片代码分享
Nov 09 #Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 #Python
You might like
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
php过滤XSS攻击的函数
2013/11/12 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python时间整形转标准格式的示例分享
2014/02/14 Python
Python解析最简单的验证码
2016/01/07 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
python中如何打包用户自定义模块
2020/09/23 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
大学生应聘推荐信范文
2013/11/19 职场文书
学院书画协会部门职责
2013/11/28 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
创业计划书之美甲店
2019/09/20 职场文书
详解Go与PHP的语法对比
2021/05/29 PHP
详解Redis基本命令与使用场景
2021/06/01 Redis
python自动计算图像数据集的RGB均值
2021/06/18 Python
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers