京东正在举行抢购活动,我也饶有兴趣的进去血拼了一把,经常抢购进去后在提交定单的时候遇到了蛋疼的验证码,不只是问答题的方式,而且还只接受中文,不得不说这是一个很好的创意,但是现在聊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脚本就可以看到会自动答题的程序了。