社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

马哥Linux运维 • 7 年前 • 866 次点击  

本文分享自 Linux 视野。滑动式验证码现在使用越来越广泛了,关于怎么攻克的文章之前看到的不多,这篇提供了一个思路。


作者:fantlam 

来源:http://www.linuxsight.com/blog/95657

1 abstract

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

2 内容概述

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

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

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

3 研究对象

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

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

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

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

4 定性分析

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

发现如下特点:

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

A图完全是由B和C合成

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

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

对外公开提供了过多信息

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

5 定量分析

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

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

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

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

6 求解图片

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

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

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

得到如下的统计图:

然后对这个曲线求一阶导数或者只要发现有个突变值超过最大像素值的某百分比时,即可得到最左边的那个y方向突变点的位置。

到此为止,此图片的位置已经成功解出。

下面是相应的python代码:

  1. import numpy as np

  2. ...

  3. def get_boundary(mask, axis, ratio=0.6):

  4. """

  5. 对ç°åº¦å¾çæä¸ªchannelååç´ ç»è®¡

  6. """

  7. sum_along_axis = np.sum(mask, axis=axis)

  8. max_value = np.max(sum_along_axis)

  9. bound_value = max_value * ratio

  10. bvalue = (sum_along_axis >= bound_value).astype('int8')

  11. return np.where(bvalue != 0)[0][0]

  12. def get_predict_ans(img):

  13. """

  14. æ ¹æ®åç±»åºæ¥çå¾åï¼æ¾å°ç¸åºçå¾åä½ç½®

  15. ä¼ å¥äºè¿å¶çå¾çï¼è¿åç­æ¡

  16. :param img:

  17. :return:

  18. """

  19. nd_img = np.array(img)

  20. w_pos = get_boundary(nd_img, 0) # æ ¹æ®åå¸å¾æ¾å°è¾¹çä½ç½®

  21. return w_pos

总结

以上所述是小编给大家介绍的Python实现图片滑动式验证识别方法,希望对大家有所帮助!



————广告时间————


马哥教育2017年Python自动化运维开发实战网络班12月3日开班,马哥联合BAT、豆瓣等一线互联网Python开发达人,根据目前企业需求的Python开发人才进行了深度定制,加入了大量一线互联网公司:大众点评、饿了么、腾讯等生产环境真是项目,课程由浅入深,从Python基础到Python高级,让你融汇贯通Python基础理论,手把手教学让你具备Python自动化开发需要的前端界面开发、Web框架、大监控系统、CMDB系统、认证堡垒机、自动化流程平台六大实战能力,让你从0开始蜕变成Hold住年薪20万的Python自动化开发人才

扫描二维码领取学习资料

更多Python好文请点击【阅读原文】哦

↓↓↓


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/LsiLje9ECM
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/4209
 
866 次点击