`
xidajiancun
  • 浏览: 492516 次
文章分类
社区版块
存档分类
最新评论

从12306谈起验证码的架构

 
阅读更多
最近和众屌丝一样,在12306上面刷着春节回家的票。与她大战无数个回合之后,终于抢到了一张回家的高铁票,不断感慨最近人品还不错。当前,在使用12306的过程中,充满很多的心酸,念叨了铁道部的亲人很多次(罪过),其中最让人纠结的一项即是:验证码。
12306采用验证码, 无疑是一种很不错的措施,可以在一定程度上阻止了黄牛们的疯狂行为,不过也给正常使用验证码的童鞋带了个很头痛的问题,在选座提交订单的关键时候,竟然验证码图片拉取不下来又或者验证过程非常耗时。鉴于自己也是无数码农中的有这职业病的一员,为此也来谈谈关于验证码的优化方案。
验证码通常一张静态的图片,但是12306使用的却是一张动态的图片(GIF格式),动态图片的验证码大大的提高了破解的难度,但无疑也具备比较高的生成成本。我们首先来看一下通常情况下的验证码校验流程:


1)浏览器向验证码服务器发起获取验证码图片的请求;
2)验证码服务器返回验证码图片文件和图片文件对应的ID编号(ID编号一般下发到浏览器的Cookie中);
3)浏览器提交用户输入的验证码和图片文件ID编号;
4)Web服务器校验用户输入的验证码与图片中展示的验证码是否一致,根据校验结果来向用户展示不同的页面;

下面我们来看一下系统的整体架构图:

主要处理流程为:
1、获取验证码
1)从配置中心中获取当前可用的频率控制、验证码库、待验证库可用的服务地址列表
2)频率控制,主要控制当前请求是否属于恶意攻击;
3)验证码库,获取可用的验证码信息,即获取一个可用的验证码图片文件地址;
4)将获取到的验证码信息写入到待验证库中,方便后续进行校验验证码;
2、校验验证码
1)根据从前端获取到的图片编号(获取验证码时,下发的对应编号),来从待验证库中获取验证信息;
2)将验证结果发送到校验统计模块;

在设计过程中需要考虑的点:
1)恶意刷新
来自某个IP频繁的请求验证码,大体上就可以判定验证码正在被刷中,需要采取措施进行一定的频率限制,降低继续被刷的请求量,这里我们可以采用比较简单限制来个某个IP请求次数,当然也可以根据业务特性,添加业务对应的频率控制逻辑;
2)验证码有效期
验证码可以生成一条Key—Value的数据存放到Memcache中(即待验证库),Value为:验证码图片文件ID、验证码Code、生成时间,每个请求验证码图片的请求,均在缓存中插入一条记录,每发送一个验证请求,即将缓存中的这条记录删除失效。
3)图片文件与图片编号
两者之间不可以建立一一对应的关系,否则,坏人只需要保存图片编号,下次就可以重复提交对应的验证码;但是可以建立一对多的关系,也就是一张图片对应多个图片编号,但是一图片编号只能唯一对应图片;
4)验证码生成
验证码图片文件的生成相比而言是比较慢的操作,所以需要采用离线计算成功的方案,避免浏览器获取图片验证码文件耗时比较久,影响用户的体验;这里存放一个问题,什么时机启动验证码生成的流程,有以下几种策略:
a)每天定时生成更新,策略简单实现;
b)定时检测验证码可用量,来生成一批新的验证码文件;
总之,验证码图片文件的生成必须是离线进行的,同时在此时需要为图片文件生成一个或者多个编号;服务部署的个数,完全取决于验证码的消耗量;
5)验证码库
验证码库,应该采用那种数据结构?Mysql还是其他的数据结构。在这里,可以尝试采用Redis的list结构来当作消息队列来使用或者其他的可用的消息队列。需要获取验证码时,从消息队列中Pop出一个值即可。每个记录中至少需要存储的字段为:图片编号、图片地址、验证码等信息。消息队列中的记录 < 50%时,可以出发验证码生成逻辑来定时插入新的验证码。面对更并发的验证码请求量,可以在集群中多部署几套Redis消息队列以及验证码生成系统来应对;
6)图片编号的生成
验证码图片文件需要支持在多台机器上面部署多个服务,同时也要支持在单机上面部署多个服务,这里就需要解决如何来生成唯一验证码图片编号的问题。可以通过根据机器IP和服务编号来解决这个问题,每台机器上面的服务均存在一个服务编号(保证服务编号在单机上是唯一的),计算公式可以为:ID = MD5(IP+服务编号+时间戳+自动序列号);

其实,上面写的都是错的,我压根没有做过类似的服务。
分享到:
评论

相关推荐

    12306架构.pdf.zip

    12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构12306架构...

    c#操作12306验证码图片

    选取一张12306的验证码图片,点击截取关键字,获取当前验证码图片中的关键字,并调用百度OCR的接口识别文字。截取子图片,得到8个子图片。程序到此为止。需要后来者识别这8个子图片得到验证信息。(有一个问题,加载...

    12306验证码(已标注)

    如果模型表现良好,那么它可以应用于实际的验证码识别场景,比如开发一个辅助工具帮助用户自动识别12306的验证码,或者进一步优化验证码识别技术,提升AI对抗验证码的能力。 总的来说,12306已标注验证码数据集为...

    12306登录图形验证码识别-基于深度学习

    1. 12306登录验证码识别基于深度学习; 2. 解压send.rar后在里面的bin目录下找到client.exe,并打开 3. 在client界面中点击选择图片中,选择send文件夹中Images中的图片,点击client界面的send按钮后,程序就会把...

    12306奇葩验证码原理

    12306奇葩验证码原理,讲述了生成的原理和验证的原理,12306奇葩验证码原理

    12306验证码JAVA DEMO

    12306验证码JAVA DEMO是一个典型的计算机编程示例,主要关注的是使用Java语言来实现对12306网站验证码的识别和处理。在12306购票系统中,验证码是为了防止恶意机器人自动刷票而设置的一种安全机制。它的设计通常包括...

    12306验证码jar包

    12306test验证码JAR包 http://www.12306test.com/

    12306 新版验证码识别python脚本

    12306新版验证码识别Python脚本是一个用于自动化处理12306网站验证码的程序,这在购票高峰期尤其有用,因为手动输入验证码可能会耽误时间。本文将深入探讨这个脚本背后的原理、技术栈以及如何实现验证码识别。 ...

    12306验证码

    【12306验证码】是中国铁路客户服务中心网站12306为了防止恶意自动登录和购票行为而设计的一种安全机制。它通过显示图形验证码来验证用户身份,要求用户在输入用户名和密码的同时,正确识别并输入图片上显示的一组...

    12306动态验证码

    【12306动态验证码】是一种为了提升网络安全性,防止恶意自动登录和攻击而设计的验证机制。在12306火车票预订系统中,动态验证码的应用旨在确保用户是真实的个人,而非自动化程序。这种验证码技术的核心在于其动态性...

    12306互联网售票系统的架构优化及演进.ppt

    12306互联网售票系统的架构优化及演进 12306互联网售票系统的架构优化及演进是指对12306互联网售票系统的架构进行优化和演进,以提高系统的性能和可扩展性。该系统的架构优化是为了解决系统在高峰期的访问量超出...

    12306登录图形验证码识别-基于深度学习(Version2)

    1. 解压后找到里面的Bin目录,找到里面的client.exe并双击; 2. 选择解压后目录中的Images文件夹中的图片,点击下面的send按钮;

    PHP仿12306图片验证码

    在12306购票的时候验证码是一件特别令人烦恼的事情,现在分享一个可以识别图片验证码的功能,PHP仿12306官网图片验证码功能

    12306查询验证码识别客户端

    《12306查询验证码识别技术解析》 在当今的网络时代,12306作为中国铁路官方购票平台,其验证码系统是保障用户安全的重要屏障,同时也是自动化购票程序的一大挑战。本文将深入探讨“12306查询验证码识别客户端”这...

    构建自托管的12306验证码识别服务器实践源码.zip

    【资源介绍】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,也可以作为小白...构建自托管的12306验证码识别服务器实践源码.zip

    基于C#实现12306的动态验证码变成静态验证码的方法

    主要介绍了基于C#实现12306的动态验证码变成静态验证码的方法的相关资料,需要的朋友可以参考下

    12306免验证码抢票工具 12年10日亲测可用C#源码

    标题中的“12306免验证码抢票工具 12年10日亲测可用C#源码”指的是一个基于C#编程语言开发的软件工具,专为2012年的12306铁路客票系统设计,用于帮助用户快速抢购火车票,特别是在高峰期,如春节等。这个工具的亮点...

    12306验证码怎么用?12306火车票订票网站图片验证码使用教程.docx

    12306验证码是12306中国铁路客户服务中心网站为了防止恶意程序自动购票而设置的一种安全机制。这种验证码通常由数字、字母或更复杂的图像组成,目的是确保购票操作是由真实用户执行而非机器人。在最新的版本中,...

    .NET MVC C# 仿12306验证码

    在本项目中,我们将探讨如何使用这两种技术来创建一个类似12306网站的动态验证码功能,其重点在于验证码的快速生成、多样性和难识别性。 验证码的主要目的是防止自动机器人或恶意脚本进行非法操作,例如批量注册、...

Global site tag (gtag.js) - Google Analytics