springmvc 图形验证码怎么填

如何评价 12306 的图片型验证码?
今早起来,发现12306对验证码系统进行了更新,变成了这样:&br&&img src=&/fe329dceb0e_b.jpg& data-rawheight=&504& data-rawwidth=&448& class=&origin_image zh-lightbox-thumb& width=&448& data-original=&/fe329dceb0e_r.jpg&&&br&&br&记得上一次12306在官方在乌云的回复是这样的:&br&&br&&img src=&/879edeb4ae62357dee742b49ec73c015_b.jpg& data-rawheight=&435& data-rawwidth=&960& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&/879edeb4ae62357dee742b49ec73c015_r.jpg&&&br&现在验证码的变化会保证12306强调的用户体验的优秀吗?
今早起来,发现12306对验证码系统进行了更新,变成了这样:…
230 个回答
可我看到的全是商机啊。对于这种 用户必须用,用户没有替代品的网站来说。把验证码变成广告位简直是丧心病狂屌炸天的商机。这些图片完全可以招标使用各种广告,比如说:请选择 健康营养又美味的【银鹭花生牛奶】请选择 过年必备旺旺产品系列中的【旺旺雪饼】【旺旺大礼包】【旺旺仙贝】请选择 今年过节不收礼,收礼只收【脑白金】的爷爷和奶奶广告图……以这种网站的流量来看,分分钟广告过亿的节奏,广告商估计花多少钱都愿意投吧。
UPDATE: 有人提到验证问题中文字的识别。所以加入了 tesseract 试了下,Good Case不多,需要改进。这里只是展示可行性。----中午看到这个验证码就囧了。以前和同学讨论过图片验证码的问题,结论就是不靠谱。图片过于复杂、混淆过多、条件太诡异时会挡住大部分正常用户容易被枚举,题库太弱,不如字符组合可能性多破解门槛不一定高于字符型Captcha目测12306图片是低分辨率网络图片。猜想用公共服务就足够破解了,不需要自己搞机器学习什么一类。公共服务例如:百度识图 Google图片 ...撸代码,试运行,一次通过,放截图:第一次:第二次:挂上 tesseract 识别试试(其实用过都知道官方训练数据准确率不高),来个Good Case。结论:233333 ~代码:
抓了几万张验证码大图,发现也就那么几种字体,每个类目的字体还一样。大图有标题,即找出XXX,每个大图一般有8个小图。一般是从8个里面选2个,8选1和8选3也有,比较少。有时候会变成18个。这个类目据我估算(3000个,不重复的2200左右),可以估算出类目在。图库也可以估算出在一千万的数量级。这个数量级不算太少,也不至于多的离谱。破解验证码还是可以一战的。比如对类目进行md5,如图所示。图片按类目也md5。最终是个时间问题,把大部分图库都扒下来。所以是可以一战的。但如果汉字部分变成扭曲的,那将是一个很大的门槛。验证码生成大图之后,再加点随机线,也就不能直接MD5了,必须机器学习。另外反对目前排名第一的@王猫猫 的答案。8张图片提交百度识图太慢了,多线程也耗资源。生产环境不会这么搞。百度识图的正确率也太低了,中文识别的正确率也太低了,根本不是解决方案。利益相关。update
22:32:应我所言,中文变扭曲了。大家全完蛋。下午的时候360抢票王更新了一版插件,可以识别,识别率不高,现在也该哭了。update
可能类目并没有之前我估计的那么多。之前抓取的应该有同一类目字体不一样的情况。。。也许类目只有几百个也说不定。今年了解了一下卷积神经网络方面的东西,以前真的是孤陋寡闻了。12306图片验证码未尝破不了。我姑且一试。有结果了继续更新。update
写了一个卷积神经网络,分类500,试试能否识别出验证码中的汉字。update
发现电脑里有以前旧的验证码样本,字母数字的那种。用卷积神经网络试了一下,分割后单个字母识别率85%,整体识别率50%以上。20毫秒识别一张。怪不得12306换验证码了。但用这个网络训练汉字识别还是不行,训练了一天还是不收敛。可能要增加网络层数和特征图数。
我也用node写了个识别的demo,也是用的百度识图,现在百度识图因为不少人用它识别12306,它屏蔽了小尺寸的图片识别(100px以下的),所以我把它放大了一下尺寸。识别的正确率一般,想要高的正确率我觉得可能还需要配合相似图片来做,不过百度识图现在太慢了。切图和放大图片我用了ImageMagick,所以想要使用这个demo,需要先安装一下ImageMagick,确保能在命令行打出convert命令~~没有用到第三方模块,所以代码行数有点多,200左右。只能作为玩耍用,要想提升准确率,需要想其他法子。// 12306.js
var http=require("http"),https=require("https"),fs=require("fs");
var exec = require('child_process').execFile;
var UA = "Mozilla/5.0 (M Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36";
//从12306获取图片
getImg().then(function(){
// 改变图片尺寸
return resizeImg();
}).then(function(){
// 把图片裁剪成8个小图片
return cropImg();
}).then(function(){
// 上传到百度识图
return toBaidu();
}).then(function(result){
// 获取结果
console.log(result);
}).catch(function(err){
console.error(err);
// 获取12306图片并保存
function getImg(){
var options = {
method:'GET',
rejectUnauthorized:false,
path:'/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&0.11197',
'Connection':'keep-alive',
'Host':'',
'User-Agent': UA
return new Promise(function(resolve,reject){
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var req=https.request(options,function(res){
var bufferArr=[];
res.on("data",function(data){
bufferArr.push(data);
res.on("end",function(){
var buffer=Buffer.concat(bufferArr);
fs.writeFile("./test.jpg",buffer,function(err){
if(err)reject(err);
resolve(true);
}).on("error",function(err){
reject(err);
req.end();
//放大图片尺寸
function resizeImg(){
var args=["-resize","440","./test.jpg","./new_test.jpg"];
return new Promise(function(resolve,reject){
exec("convert",args,function(err,stdout,stderr){
if(err)reject(err)
resolve(stdout);
// 8次并行获取关键字
function toBaidu(){
var arr=[];
arr.length=8;
return eachCallback(arr,function(val,key,callback){
var filesrc="./test_"+key+".jpg";
getBaiduImg(filesrc).then(function(imgsrc){
return getBDRes(imgsrc);
}).then(function(keywords){
callback(keywords);
}).catch(function(err){
callback(err);
// 上传图片到百度的地址
function getBaiduImg(filesrc){
return new Promise(function(resolve,reject){
fs.readFile(filesrc,function(err,fsdata){
if(err)return reject(err);
var options = {
method:'POST',
path:'/n/image?fr=html5&needRawImageUrl=true&id=WU_FILE_0&name=233.png&type=image%2Fpng&lastModifiedDate=Mon+Mar+16+A49%3A11+GMT%2B0800+(CST)&size='+fsdata.length,
'Content-Type':'image/jpeg',
'Connection':'close',
'Host' : '',
'Content-Length':fsdata.length,
'User-Agent': UA
var request=http.request(options,function(res){
var bufferArr=[];
res.on("data",function(data){
bufferArr.push(data);
res.on("end",function(){
resolve(Buffer.concat(bufferArr).toString());
}).on("error",function(err){
reject(err);
request.end(fsdata);
// 通过上传的url获取到百度识图的返回页面
function getBDRes(imgurl){
var url = "/n/searchpc?queryImageUrl=" + escape(imgurl);
return new Promise(function(resolve,reject){
http.get(url,function(res){
var bufferArr=[];
res.on("data",function(data){
bufferArr.push(data);
res.on("end",function(){
var data=Buffer.concat(bufferArr).toString();
var keyword=getKeyWord(data);
resolve(keyword);
}).on("error",function(err){
reject(err);
// 从返回页面获取keyword
function getKeyWord(html){
var match=html.match(/keywords:'(.*?)'/);
if(match && match[1]){
var jsonstr=match[1].replace(/\\x22/g,'"');
var json=JSON.parse(jsonstr);
var result=json.map(function(val){
var keyword="";
eval('keyword="'+val.keyword+'"');
return keyword;
return result;
}catch(err){
return null;
// 获取切割位置
function getCropSize(){
var arr=[];
for(var j=0;j&2;j++){
for(var i=0;i&=3;i++){
var left = 8 + (100 + 5) * i;
var top = 61 + (100 + 5) * j;
arr.push("100x100+"+left+"+"+top);
return arr;
// 分割小图片
function cropImg(){
var sizeArr=getCropSize();
var promise = eachCallback(sizeArr,function(val,key,callback){
var args=["./new_test.jpg","-crop"];
args.push(val);
args.push("./test_"+key+".jpg");
exec("convert",args,function(err,stdout,stderr){
if(err)callback(err);
else callback(stdout);
return promise;
// 数组异步并发循环
function eachCallback(arr,func){
return new Promise(function(resolve,reject){
if(!arr || !arr.length){
resolve(arr);
var s=arr.length;
var resultArr=[];
function done(data){
var key = this.key;
resultArr[key]=data;
if(s==0)resolve(resultArr);
for(var i=0;i&arr.length;i++){
var newdone=done.bind({key:i});
func.call(null,arr[i],i,newdone);
华为商城的验证码可否与之一战?
用户友好性欠佳。例如“火龙果”是什么?我表示老家那里很少有人知道,填验证码还得先搜一搜。=========首先,我很侥幸到一个有火龙果的地方读了几年大学,碰巧就认识了。但我觉得还是有很多父老乡亲不认识这货的。同理还有同学提到的生蚝。其次,认为没文化就不用出门的,我不发表看法。我不认为不认识“火龙果”就是没文化。就跟我不认为“过年不包饺子”就不叫过年一样。即便没文化,出门的权利都没有了吗?袁喆同学很机智。新出的认证的确不是那么用户友好,毕竟好一些“稀奇古怪”的图片。我知道有闲工夫上知乎的基本都认识那些图,但还有很多人的水平,只是刚好能够上网、买票。
机器学习终于可以为抢票软件派上用场了。。。。。。
部分图片识别难度过高,比如这种情况我该选最后一个吗???
12306图形验证码
验证码是一个非常有意思的问题,它的目的是区分输入者是人还是机器,这个问题本质上是一个图灵测试(推荐电影《模仿游戏》),验证码即是一种简单高效的验证方法,由CMU的教授于2000年左右创造,后来此牛人又将零星的验证码收集起来,转化为巨大的生产力,成功将上千万篇纸质文章数字化,目前Google还用其识别门牌号,路牌等()。12306昨天改用了图形验证码,而事实上,图形验证码已经不是新鲜事了,早在几个月前,Google就换成了图形验证(),图片如下:
再看看咱们12306的图片验证码:Note:如果选错了,2s钟后,才能再试,而且图片已经换了,不过可以试N次。12306图形验证码的特点1. 文字+图像双重验证
图形这一关特点很多,容后细说。文字这一关相对于单纯的文字验证码,难度系数下降了很多,基本上只有字体、加粗、大小、位置的变化。总得来说,对于这类无扭曲(易识别),重叠较小(易分割),背景单一(易二值化),的中文印刷体(易识别)来说,识别算法已经很成熟了,这一点,相信大家都见过了OCR软件的强大识别功能。此外,这里的文字并不是孤立的,必定是一个名词,这又可以进一步提高识别率。因此,想破解这一关还是比较轻松的。2. 图片很熟悉
比如贺卡、雕像、贝壳、玻璃瓶、擀面杖、热气球等,大多数是日常生活中能见到的。这就决定了类别不会太多。目前,(图像识别目前最大的数据库) 总的标记数为21841类,考虑到常见性,12306的类别数目应该不会高于这个数(我觉得应该远低于这个数),日后应该增加类别数目的可能性并不大,这就使得这个问题的分类规模不会特别大,但是,扩充每一类的数目是必然的。3. 数据库取自互联网
12306的数据标记取自互联网,也就是说对于"篮球",12306可能直接在谷歌/百度里面搜索"篮球",然后将得到的图片加到数据库。这样做原因有两点。首先,12306需要海量标记数据,如果数据库太少,那么破解软件完全可以搜集这些数据,进行对比。这就好比我们得到了老师的题库,不管老师怎么出题,我都可以从容应对。其次,12306自己标记的成本太大,考虑到数据库还需要不断更新,日后的维护成本也太高。当前,对于图像检测领域的学术研究,其数据库的标记也有很多直接取自互联网。使用互联网图片和标记固然方便,然而,这也会给破解带来便利,所谓"成也萧何败萧何",因为可以直接使用互联网数据来辅助破解。下面来两个栗子:Google图像检索
例如,抢票软件可以在谷歌中搜索图像,然后得到链接的标题,再将标题与要找的文本匹配,比如上面例子中的"春联",这就变成了一个
例如,抢票软件可以在谷歌中搜索图像,然后得到链接的标题,再将标题与要找的文本匹配,比如上面例子中的"春联",这就变成了一个文本查找的小问题了,根本不需要识别。当然这种做法的网络流量和时间消耗太大(接近1s),这种抢票软件估计造出来了,也是难以应用的。因此,抢票软件可能更倾向于本地化库。百度搜索"手铐"
既然类别不是很多,而且类别固定,那么破解软件同样可以利用标记在互联网搜索图片,然后
既然类别不是很多,而且类别固定,那么破解软件同样可以利用标记在互联网搜索图片,然后建立自己的图像库。这种思路对于12306来说,个人认为威胁很大!上图中,图像是完全匹配。即使抢票软件的库没有12306的全面,甚至与12306包含的图像不一致,都没有太大关系,大不了,破解软件对每一类训练一个分类器,比如专门训练一个手铐的分类器,然后对这8张图片分类就好了,一般来说,二分类的分类效果非常精准。当然也可以直接用多分类器,比如CNN/DNN,现在深度学习的分类结果也还可以,这里给大家一个。不过,完全用分类的思路来做,准确性肯定达不到,因为这需要计算机具有人脑一样的视觉、概念理解能力。4. 一般只要选两个
按理说,为了尽可能地增加不确定性,同一组中属于同一类的数目可以取1,2,3,….,8,不过,实际上考虑到用户感受,数目应该不会超过3个,否则用户会骂娘的……,即使是3个,很多人也会不乐意的,而1个太少,顶多猜8次,2个就有种情况,还是比较多的,所以我猜大多数情况下是只有2个属于同一类,而极少部分情况下有只有1个或者有3个,相信日后再怎么变,这个设置应该是不会变的。这就给破解带来了很大的便利,因为大多数情况下,破解的时候根本不需要知道要找的类别是什么,都不需要识别文本,只需要找到那两张图片最相似的图片就可以了,因此这就转换成一个相似性匹配的问题了(方法很多,比如最简单的灰度直方图匹配,灰度不够再加梯度方向呀,考虑旋转性再找主方向呀….)。5. 每一组图像的生成,可能用到了相似性例如热水瓶和轿子很相似,手机壳和这一组有很多矩形,显然,这会给例如热水瓶和轿子很相似,手机壳和这一组有很多矩形,显然,这会给相似性比对以及识别带来不小的干扰。6. 每一组中可能有多类都有多张图片
例如第一张图片,除了充电器外,还有2张西服,第二张图片除了螺丝刀之外,还有3张月饼。显然,这是为了应对第4点的局限而加的干扰,显然这样的干扰并不会带来多少困难,比如,第一张有2类都有2张,那么每次猜对的概率为50%,大不了有4类,每类2张,概率也高达25%。虽然用4类的不确定性更大,但这种特殊的条件设置,又会给识别带来便利,所以一般也就只有1-2类吧(这部分不够严谨)。
今日,360表示他们已经成功破解,而且,抢票成功率提升了200%……,速度之快,令人咂舌,哎,道高一尺、魔高一丈呀!不过,12306也才刚刚使用图形验证码,这个方法还有很多可以变通的地方(比如对图片进行适当旋转),总之,12306还有很多招数可以用,抢票软件能接住第一招,并不代表后续招数也能轻易接住,而且,我估计抢票软件这次接得有些投机取巧,真正要解决好这个问题,必定要用机器学习(百度、谷歌本质上也是用机器学习),这是一个还在研究并且需要长期研究的问题,否则LSVRC (Large Scale Verification code Recognition Competition)这类挑战赛就可以休矣。
岔开一句,不管怎样,12306为推广汉字以及科普常识作出了巨大贡献,比如,我之前就不知道牌坊长啥样,这不禁让我想起来我5岁进学前班的情景,那老师觉得我太小,想考考我的智商,于是拿出一本画册,要我指出哪个是老虎、哪个是大象……,现在觉得这哪里是考智商呀,分明看我是不是一个喜欢看动画片的孩子嘛!
用户体验不会太高。机器识别图案慢,人识别同样不会太快,会延误订票时间,就跟乌云的那个图里说明的一样:机器识别麻烦的,人同样也麻烦。几乎不存在一种由机器生成,人识别快、机器识别慢的东西。(联想一下图灵测试)如果是4字符验证码,字母加数字一共是36个,总数量是36^4=1679616种组合。图形验证码要达到这种组合很难,如果按照比特位来算,8个图单比特是8个,双比特是C(2,8)=28个,三比特是C(3,8)=56个,要达到4位验证码那么多数量的话,要么图片分类特别多,要么图片特别多。所以,要看他们准备了多少图了,如果图少的话,很容易被搞掉,毕竟图片是静态的,要改图还是很难的,而计算机做图形匹配其实比做文字匹配更容易(比如像素相似程度达到多少即可认为相同)。用图片最大的担忧是怕对方刷图,假设有人有足够的时间,完全可以把12306的所有图都存下来,剩下的识别工作就轻松多了,甚至卖图库就可以赚钱了。(有人已经找到方法了,用以图搜图即可)同时,可以看到12306的验证码整个是一个图,那么说明它是服务器端绘制的,画这么大一个图,服务器负载可不轻啊,我试了试刷新,频率稍微快点就显示不出来了,如果遇到节假日购票高峰,可不好说服务器会不会崩溃。
已有帐号?
无法登录?
社交帐号登录|  
|  
|  
|  
|  
只需一步,快速开始
查看: 1631|回复: 7
今天怎么了,验证码总是输入的和图片显示一样,但是就是不对。
主题帖子积分
游戏达人, 积分 2421, 距离下一级还需 1079 积分
游戏达人, 积分 2421, 距离下一级还需 1079 积分
如题,火狐浏览器一直就是验证码输入的和图片一样,但是就是不对。
换IE就没问题了,不知道什么问题。
希望管理员能完善下。
主题帖子积分
游戏达人, 积分 2421, 距离下一级还需 1079 积分
游戏达人, 积分 2421, 距离下一级还需 1079 积分
是和我每次关网页都自动删除Cookie有关吗??
主题帖子积分
贡献度4767
金元7968503
确实有人的浏览器有这个问题。
临时解决办法是将验证码的图片另存为,然后看图输入。
主题帖子积分
游戏达人, 积分 2421, 距离下一级还需 1079 积分
游戏达人, 积分 2421, 距离下一级还需 1079 积分
好的,谢谢。
主题帖子积分
新手玩家, 积分 5, 距离下一级还需 25 积分
新手玩家, 积分 5, 距离下一级还需 25 积分
可能是服务器的调配问题吧
主题帖子积分
游戏菜鸟, 积分 0, 距离下一级还需 2 积分
游戏菜鸟, 积分 0, 距离下一级还需 2 积分
我也是,换个浏览器就好了
主题帖子积分
新手玩家, 积分 12, 距离下一级还需 18 积分
新手玩家, 积分 12, 距离下一级还需 18 积分
我也是,换个浏览器就好了
主题帖子积分
新手玩家, 积分 7, 距离下一级还需 23 积分
新手玩家, 积分 7, 距离下一级还需 23 积分
我曾听说回复是要求要满十五个字
Powered byPHP图形验证码的具体实现方法
PHP图形验证码的具体实现方法
| 时间: 21:47:51 | 阅读数:
[导读] 我们现在在网站注册等地方经常会见到需要你输入验证码的请款,它就是将随机数字或符号以图片的形式展现在用户面前,并提供验证后才能使用相关功能。今天我们就介绍具体实现代码如下:
我们现在在网站注册等地方经常会见到需要你输入验证码的请款,它就是将随机数字或符号以图片的形式展现在用户面前,并提供验证后才能使用相关功能。今天我们就介绍
具体实现代码如下:&&class&rndnum{ &&function&rnd(){ &srand((double)microtime()*1000000); &$rnd_number=array( &1='1', &2='2', &3='3', &4='4', &5='5', &6='6', &7='7', &8='8', &9='9', &10='a', &11='b', &12='c', &13='d', &14='e', &15='f', &16='g', &17='h', &18='i', &19='j', &20='k', &21='l', &22='m', &23='n', &24='o', &25='p', &26='q', &27='r', &28='s', &29='t', &30='u', &31='v', &32='w', &33='x', &34='y', &35='z', &36='0' &); &$result=array_rand($rnd_number,6); &$j=count($result); &for&($i=0;$i$j;$i++)&{ &$re.=$rnd_number[$result[$i]]; &} &//$re=$rnd_number[$result[1]].$rnd_number[$result[2]].$rnd_number[$result[3]].$rnd_number[$result[4]].$rnd_number[$result[5]].$rnd_number[$result[6]].$rnd_number[$result[7]]; &//return&array_keys($result); &return&$ &} &} &/*用法 &$rndnum=new&rndnum(); &$num=$rndnum-rnd(); &echo&$ &*/ &&生成PHP图形验证码的图片,将随机数填充到里边:&&Header("Content-type:&image/PNG");& &require_once("rndnum.php"); &$rndnum=new&rndnum(); &$authnum=$rndnum-rnd(); &session_start(); &$_SESSION["extrra_code"]=$ &$im&=&imagecreate(72,20);& &$black&=&ImageColorAllocate($im,&0,0,0);& &$white&=&ImageColorAllocate($im,&255,255,255);& &$gray&=&ImageColorAllocate($im,&200,200,200);& &imagefill($im,0,0,$gray);&& &imagestring($im,5,10,3,$authnum,$black);& &for($i=0;$i;$i++)&&&//加入干扰象素& &{& &&&&&$randcolor&=&ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255)); &&&&&imagesetpixel($im,&rand()%70&,&rand()%30&,&$randcolor);& &}& &ImagePNG($im);& &ImageDestroy($im);& &&以上就是全部PHP图形验证码的实现代码,希望对大家有所帮助。
手机扫描下方二维码,关注php100官方微信。
同步官网每日更新,为您带来随时随地的资讯与技术信息。更有不定期的互动抽奖活动,赢取实用贴心的小礼物。
除非特别声明,PHP100新闻均为原创或投稿报道,转载请注明作者及原文链接原文地址:
友情链接与合作伙伴
粤ICP备号-3请登陆后使用
只需一步,快速开始
吧友自助信息发布区,请自行甄别
查看: 786|回复: 12
宝购下单需要输入图形验证码了?我是一个人?
RT、记得之前没有验证码啊、号有问题了?还是都有验证码了、
QQ截图08.png (39.23 KB, 下载次数: 0)
20:03 上传
我正常的4个号宝购首单付款的时候全部都要输验证码的&
我正常的4个号宝购首单付款的时候全部都要输验证码的
好吧、我记得前两天还不要的、、谢谢、&
<p id="rate_907" onmouseover="showTip(this)" tip="&果果 + 1
" class="mtn mbn">
手机付款就好了
不是、是下单的时候需要输入图形验证码。你也是么?&
mxj5188 发表于
我正常的4个号宝购首单付款的时候全部都要输验证码的
怎么四个号&&可以不绑卡吗
4个号4个shen/份证绑卡的,全家老小一波流&
怎么四个号&&可以不绑卡吗
4个号4个shen/份证绑卡的,全家老小一波流
前几天不要 可能防软件了吧
<p id="rate_907" onmouseover="showTip(this)" tip="&果果 + 1
" class="mtn mbn">
手机付款就好了
tong同,手残今天没抢到黄金
<p id="rate_907" onmouseover="showTip(this)" tip="&果果 + 1
" class="mtn mbn">
Powered by}

我要回帖

更多关于 图形验证码 java 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信