YYW'S BLOG 我思故我在

知识的分享就是知识的获得
posts - 58, comments - 279, trackbacks - 4, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

“破解” 京东验证码

Posted on 2011-06-17 00:47 阿武 阅读(313) 评论(0) 编辑 收藏

        京东正在举行抢购活动,我也饶有兴趣的进去血拼了一把,经常抢购进去后在提交定单的时候遇到了蛋疼的验证码,不只是问答题的方式,而且还只接受中文,不得不说这是一个很好的创意,但是现在聊QQ少了,打中文都不灵验了,有些字半天打不出来,今天 出于兴趣对它的验证码研究了一下。访问http://jd2008.360buy.com/purchase/checkcode.ashx 即可看到验证码的效果,经过几次刷新,发现问题其实是固定的,多刷新几次就可以看到重复的问题,于是写了段rub脚本保存了100张验证码。

Ruby代码如下: 

require "open-uri"

for i in 1..100
    uri
="http://jd2008.360buy.com/purchase/checkcode.ashx"
    data
=open(uri){|f|f.read}
    
open("img\\" + i.to_s + ".gif","wb"){|f|f.write(data)}

end 

保存下来的图片如下(这里仅选择其中几张):


 

 

 

 

 

 

 

如果去分析其中的内容自然是一个费神费力的工作,不过大家有没有注意到这里的每张图片长度是不一样的, 抓住这一点,我们就可以很轻易的通过宽度来判断出问题的内容了,而且是相当简单,虽然不算完美(这就是为什么标题里的“破解”要加上引号的原因),但至少目前基本可用。当然,京东想睹上这个漏洞也是相当容易的,这里就是探讨了。

 

        下面要做的事就是写一个demo,通过之前保存下来的100张图片采样得到一组数据。在后面的代码中会使用到。

        编写一个demo用的页面:

<html>

<body style="margin: 0px;">
    
<img id="OrderCheckCodeImg" style="-webkit-user-select: none" src="http://jd2008.360buy.com/purchase/checkcode.ashx">
    
<input type="text" id="answer" />
</body>
</html>
        将其随便放到一个Web Server里面面,我这里使用了tomcat。启动tomcat,继续编写自动化测试脚本:
 
require 'logger'
require 
'watir'

STDOUT.sync 
= true
log = Logger.new(STDOUT)
log.level = Logger::DEBUG

answers 
= {}
answers
[598] = ''
answers
[442] = '金箍棒' 
answers
[546] = '错误' 
answers
[780] = '' 
answers
[325] = '郑州' 
answers
[390] = '' 
answers
[494] = '飞机票'
answers
[585] = ''
answers
[403] = ''
answers
[351] = ''
answers
[481] = ''
answers
[429] = '青岛'
answers
[650] = '正确'
answers
[572] = ''
answers
[624] = ''
answers
[663] = ''
answers
[312] = ''
answers
[520] = ''
answers
[507] = ''
answers
[533] = ''
answers
[455] = ''
answers
[364] = '美羊羊'
answers
[416] = '不在'
answers
[728] = ''
answers
[676] = '麦当劳'
answers
[338] = ''

#answers.each_value {
|value| value.encode!('gbk') }

url 
= "http://localhost:8080/checkcode.htm"
ie 
= Watir::IE.new
ie.
goto url
ie.wait

while true do
    ie.refresh
    ie.wait
    
    img 
= ie.image(:id, 'OrderCheckCodeImg')
    a 
= answers[img.width.to_i]
    a 
= 'Unknow' if a.nil?
    ie.text_field(:id, 
'answer').set a
    
    sleep 
3
end
 
        运行该Ruby脚本就可以看到会自动答题的程序了。