结合Cookie的简单图片验证码的工作原理探究

结合Cookie的简单图片验证码的工作原理探究在系统登录时,往往需要同时提交一个验证码。验证码的作用是验证登录者是不是人,因为人能轻松识别的图片,对于机器来说难度却比较大,因此在登陆时进行验证码校验可以阻断大部分爬虫机器人的骚扰,成本低,收益大,使得图片验证码得到了广泛的应用。本文通过网络分析的方式,stepbystep地探索了图片验证码的工作原理,文章技术门槛低,可读性和可操作性较强,适用于各种闲着没事干的无聊分子。1.百度“系统登录”,随便找了个登录网站:http://scm.fstvgo.com/2.打开该网站,按F12打开.

大家好,又见面了,我是你们的朋友全栈君。

在系统登录时,往往需要同时提交一个验证码。验证码的作用是验证登录者是不是人,因为人能轻松识别的图片,对于机器来说难度却比较大,因此在登陆时进行验证码校验可以阻断大部分爬虫机器人的骚扰,成本低,收益大,使得图片验证码得到了广泛的应用。本文通过网络分析的方式,step by step地探索了图片验证码的工作原理,文章技术门槛低,可读性和可操作性较强,适用于各种闲着没事干的无聊分子。

1.百度“系统登录”,随便找了个登录网站:

http://scm.fstvgo.com/

 

2.打开该网站,按F12打开开发者模式,点击Network,点击F5进行页面刷新,在Network栏中查看网站请求接口,可以看到有两个比较主要的,

第一个是网站页面的请求API:

Request URL: http://scm.fstvgo.com/
Request Method: GET
Status Code: 200 OK
Remote Address: 117.40.130.60:80
引用站点策略: unsafe-url

Request Header:
GET / HTTP/1.1
Host: scm.fstvgo.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: ASP.NET_SessionId=iqzvmskmcbhvuwwgap2kw3pv

第二个是验证码图片的请求API:

Request URL: http://scm.fstvgo.com/Login/GetValidateCode
Request Method: GET
Status Code: 200 OK
Remote Address: 117.40.130.60:80
引用站点策略: strict-origin-when-cross-origin

Request Header:
Accept: image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: keep-alive
Cookie: ASP.NET_SessionId=iqzvmskmcbhvuwwgap2kw3pv
Host: scm.fstvgo.com
Referer: http://scm.fstvgo.com/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42

 

3.直接点击“登录”,查看Network栏中的请求与响应如下:

Request URL: http://scm.fstvgo.com/Login/Login
Request Method: POST
Status Code: 200 OK
Remote Address: 117.40.130.60:80
引用站点策略: strict-origin-when-cross-origin


Request Header:
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: keep-alive
Content-Length: 57
Content-Type: application/x-www-form-urlencoded
Cookie: ASP.NET_SessionId=iqzvmskmcbhvuwwgap2kw3pv
Host: scm.fstvgo.com
Origin: http://scm.fstvgo.com
Referer: http://scm.fstvgo.com/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42
X-Requested-With: XMLHttpRequest


Form Data:
dlrID: 
dlrPwd: 
checkCode: 
X-Requested-With: XMLHttpRequest
{"errorMsg":"验证码不正确!"}

猜测验证码的工作原理是:

1.客户端请求验证码;

2.服务器端生成随机验证码并保存,并根据验证码生成图片,然后回复给客户端;

3.客户端进行登录,输入正确的验证码,服务器端拿到后和存储的验证码进行比较,一致则返回true,不一致则返回false

 

下面使用python实际验证下:


def yzm():
    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Referer': 'http://scm.fstvgo.com/',
        'Host': 'scm.fstvgo.com',
        'Origin': 'http: // scm.fstvgo.com',
        'X-Requested-With': 'XMLHttpRequest',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42',
    }
    base_url = "http://scm.fstvgo.com/"
    login_url = "http://scm.fstvgo.com/Login/Login"
    yzm_url = "http://scm.fstvgo.com/Login/GetValidateCode"
    requests.get(base_url, headers=headers)
    cap = requests.get(yzm_url, headers=headers)
    with open("cap.png", "wb") as f:
        f.write(cap.content)
        f.close()
    print('打开cap.png,查看并输入其中的验证码:')
    jym = sys.stdin.readline()
    jym = jym.replace('\n', '')
    print(jym)

    data = {
        'dlrID': '',
        'dlrPwd': '',
        'checkCode': jym,
        'X-Requested-With': 'XMLHttpRequest'
    }
    try:
            content = requests.post(login_url, data=data, headers=headers)
            content.encoding = content.apparent_encoding
            content_text = content.text
            content_text = content_text.encode('utf-8').decode('unicode_escape')
            print(content_text)
    except Exception as e:
        print(e)

首先请求验证码,并保存为图片,打开验证码,在终端输入验证码后进行Login,按照这个步骤的话,验证码校验应该就会通过了。

But… …

还是返回{“errorMsg”:”验证码不正确!”}

仔细对比了下Header,等等,这个Cookie是干什么的?

其实上面的原理分析不全面:Login时服务器端怎么区分你就是之前请求验证码的那个客户端呢?答案就是Cookie。

 

因此,结合Cookie的图片验证码的工作原理是:

1.客户端使用带Cookie的Header请求验证码;

2.服务器端生成随机验证码verifycode,然后保存为Cookie : verifycode键值对,并根据验证码生成图片,然后回复给客户端;

3.客户端使用同1中的Cookie进行登录,输入正确的验证码,服务器端根据该Cookie查询到相对应的verifycode,并和传过来的进行比较,一致则返回true,不一致则返回false,查不到的话如这个服务器居然还返回了NullReferenceException… …

因此,在Header中加入Cookie后,验证通过。

    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Referer': 'http://scm.fstvgo.com/',
        'Host': 'scm.fstvgo.com',
        'Origin': 'http: // scm.fstvgo.com',
        'X-Requested-With': 'XMLHttpRequest',
        'Cookie': 'ASP.NET_SessionId=xf3vipkyf5vxf34n0acc5t0e',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42',
    }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159594.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • dropdownlist控件的几个属性selectedIndex、selectedItem、selectedValue、selectedItem.Text、selectedItem.value的区别…

    dropdownlist控件的几个属性selectedIndex、selectedItem、selectedValue、selectedItem.Text、selectedItem.value的区别…1.selectedIndex——指的是dropdownlist中选项的索引,为int,从0开始,可读可写2.selectedItem——指的是选中的dropdownlist中选项,为ListItem,只读不写3.selectedValue——指的是选中的dropdownlist中选项的值,为string,只读不写4.selectedItem.Text——指的是选中的drop…

    2022年10月16日
    2
  • 大话数据结构PDF原文内容分享[通俗易懂]

    大话数据结构PDF原文内容分享[通俗易懂]大话数据结构为超级畅销书《大话设计模式》作者程杰潜心三年推出的扛鼎之作!以一个计算机教师教学为场景,讲解数据结构和相关算法的知识。通篇以一种趣味方式来叙述,大量引用了各种各样的生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到的一些经典算法做到逐行分析、多算法比较。与市场上的同类数据结构图书相比,本书内容趣味易读,算法讲解细致深刻,是一本非常适合自学的读物。获取方式提取码:8i5k目录第1章数据结构绪论1.1开场白1.2你数据结构怎么学的?1.3数据结构起源1.

    2022年6月24日
    33
  • 研华acdp手机版_generation z

    研华acdp手机版_generation z上帝手中有 N 种世界元素,每种元素可以限制另外 1 种元素,把第 i 种世界元素能够限制的那种世界元素记为 A[i]。现在,上帝要把它们中的一部分投放到一个新的空间中去建造世界。为了世界的和平与安宁,上帝希望所有被投放的世界元素都有至少一个没有被投放的世界元素限制它。上帝希望知道,在此前提下,他最多可以投放多少种世界元素?输入格式第一行是一个整数 N,表示世界元素的数目。第二行有 N 个整数 A[1],A[2],…,A[N]。A[i] 表示第 i 个世界元素能够限制的世界元素的编号。输出格式

    2022年8月11日
    2
  • FilterDispatcher工作流程和原理「建议收藏」

    FilterDispatcher工作流程和原理「建议收藏」publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsIOException,

    2022年7月2日
    30
  • 在线客服系统源码 自适应手机移动端 支持多商家 带搭建教程

    在线客服系统源码 自适应手机移动端 支持多商家 带搭建教程下载链接:在线客服系统源码自适应手机移动端支持多商家支持微信公众号/微信小程序带搭建教程-PHP文档类资源-CSDN下载PHP轻量级人工在线客服系统源码自适应手机移动端支持多商家带搭建教程支持多商家支持多商家,每个注册用户为一个商家,每个商家可以添加多个客服。不限坐席每个商家可以无限添加坐席,不限制坐席数支持H5移动端系统自动适配移动端,也可以接入app(h5方式)支持微信公众号/微信小程序客服可以与微信公众号/小程序里的访客实时沟通常见问题自动回复…

    2022年7月19日
    19
  • NMS 原理 了解

    NMS 原理 了解

    2021年6月7日
    137

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号