TA的每日心情 | 奋斗 2020-6-5 22:18 |
---|
签到天数: 22 天 [LV.4]偶尔看看III
|
本教程主要讲述三个方面:账号密码验证码正确性检测、账号信息获取及代码优化。
一、账号密码验证码正确性检测
我们每次教程都少不了协议分析工具HttpWatch Professional,那我们先来看下,当登陆论坛时,账号或密码输入错误的HttpWatch里的数据。经分析,我们所用到的数据中多数和第一课的一样,唯一不同的地方是返回数据Content里内容:
[code=php]<?xml version="1.0" encoding="gbk"?>
<root><![CDATA[登录失败,你还可以尝试 4 次<script type="text/javascript" reload="1">if(typeof errorhandle_ls=='function') {errorhandle_ls('登录失败,你还可以尝试 4 次', {'loginperm':'4'});}</script>]]></root>[/code]经实验,上面的返回数据中是账号或密码之一输入错误时的返回,当然两者都错误的返回也同上。现在我们根据第五课的相关知识
用易语言来编写子程序“检测账号密码是否有误”,我们在这里把此子程序的返回值定义为“逻辑型”,如果账号密码无误返回真,反之返回假。在分析中可知,协议头Headers和第一课中基本一样(注:明显的不一样之处就是域名,如果你完整得看过这些教程,你懂了 ),那我们直接引用第五课中的代码,现在我们把代码贴出来:
- .版本 2
- .子程序 检测账号密码是否有误, 逻辑型, , 检测账号密码是否有误,并且返回数据。第八课中增加
- .参数 账号, 文本型, , 论坛账号
- .参数 密码, 文本型, , 论坛密码
- .参数 返回内容, 文本型, , 第一次登陆账号时的 Content
- .局部变量 URL, 文本型
- .局部变量 POSTData, 文本型
- Request.Accept = “image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*”
- Request.AcceptEncoding = “gzip,deflate”
- Request.AcceptLanguage = “zh-cn”
- Request.CacheControl = “no-cache”
- Request.Connection = “Keep-Alive”
- ' Request.ContentLength = 61 '第七课改
- Request.ContentType = “application/x-www-form-urlencoded”
- Request.Host = “demo.wgbcw.com”
- Request.Referer = “http://demo.wgbcw.com/dzx151gbk/forum.php”
- Request.UserAgent = “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) ”
- ' Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) IE8.0
- ' 上面这注释为 IE 8.0下截取的数据
- URL = “/dzx151gbk/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1”
- ' username=账号字符串&password=密码字符串&quickforward=yes&handlekey=ls
- POSTData = “username=” + 账号 + “&password=” + 密码 + “&quickforward=yes&handlekey=ls” ' 附加数据
- Request.ContentLength = 取文本长度 (POSTData) ' 附加数据长度
- POST (URL, POSTData, 返回内容) ' 调用自定义子程序用HTTP协议和服务器通信
- 取Cookie并设置 (“http://” + Request.Host + URL) ' 这代码以后再祥细讲述
- .如果 (寻找文本 (返回内容, “登录失败”, , 假) = -1) ' 如果账号密码无误则为-1
- 返回 (真)
- .否则
- 返回 (假)
复制代码 上述代码里重点提下:寻找文本 (返回内容, “登录失败”, , 假),由于当账号或密码输入错误登陆时,返回数据Content中有“登录失败”的文本,那我们就利用易语言中的命令“寻找文本”来判断账号或密码输入是否有误。
我们接着讲述,登陆论坛过程中,输入验证码登陆论坛时,当验证码输入错误的情况,先看下此时的相关数据:
1、返回数据Content:
[code=php]<?xml version="1.0" encoding="gbk"?>
<root><![CDATA[验证码填写错误,请返回修改。<script type="text/javascript" reload="1">if(typeof errorhandle_login=='function') {errorhandle_login('验证码填写错误,请返回修改。', {});}</script>]]></root>[/code]2、验证码输入错误时,验证码框中的提示:
我们参考第七课中的论坛登陆核心代码只要在返回内容之后把原来的返回提示修改下就可以,参考代码:
- .版本 2
- .' 如果 (寻找文本 (返回内容, “欢迎你回来”, , 假) ≠ -1)
- ' 信息框 (“论坛登陆成功。”, 0, “登陆提示”)
- .否则
- ' 信息框 (“论坛登陆失败。”, 0, “登陆提示”)
- .如果结束
- ' 上面代码第八课中修改
- .判断开始 (寻找文本 (返回内容, “欢迎你回来”, , 假) ≠ -1)
- 信息框 (“论坛登陆成功。”, 0, “登陆提示”)
- .判断 (寻找文本 (返回内容, “验证码填写错误”, , 假) ≠ -1)
- 信息框 (“验证码填写错误,请返回修改。”, 0, “登陆提示”)
- .默认
- .判断结束
复制代码 好了,暂时写到这里,有事要出去下。先把上述内容的HttpWatch里的参考数据发上来:
二、账号信息获取
我们要取账号用户信息,那就在HttpWatch中当账号成功登陆论坛后提示带“3秒后跳转,点击跳转”提示的窗口时,快速单击HttpWatch工具的“Record”按钮来获取网页数据。经测试后,一般情况下,HttpWatch最少可获取到12条数据,也就是此过程能获取12条以上的数据。下面我们先看下第一条数据:
当然也少不了Headers(协议头)、Cookies(不用说了吧)、Content(返回内容)及Stream(数据流)。
Headers(协议头):
- (Request-Line) GET /dzx151gbk/forum.php HTTP/1.1
- Accept image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
- Accept-Encoding gzip, deflate
- Accept-Language zh-cn
- Connection Keep-Alive
- Cookie 6Qvx_2132_lastvisit=1333455830; 6Qvx_2132_sid=h6W4gz; 6Qvx_2132_lastact=1333459455%09misc.php%09seccode; _D_SID=113678A4; 6Qvx_2132_seccodeS8Yb7=3603fQXUGT3MaqOWQ36XAmwfYd954Z9gKJv7hQvP%2Fwfc0jytZ2jV3bkmjnn69BP4CG9cFO9fFFrpqR8; 6Qvx_2132_auth=c970CTDoemKodG0M%2BSh1v2u8gSGUQ3I0EsjtU4PrUFCOxeIUXDQ4s0FS147%2FXp916L1jwEGzyQeMWkYVL%2B6S
- Host demo.wgbcw.com
- User-Agent Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)
复制代码 Cookies:- _D_SID Sent 113678A4 / demo.wgbcw.com (Session)
- 6Qvx_2132_auth Sent c970CTDoemKodG0M+Sh1v2u8gSGUQ3I0EsjtU4PrUFCOxeIUXDQ4s0FS147/Xp916L1jwEGzyQeMWkYVL+6S
- 6Qvx_2132_lastact Sent 1333459455 misc.php seccode / demo.wgbcw.com Wed, 04-Apr-2012 13:24:15 GMT
- 6Qvx_2132_lastact Received 1333459459 forum.php / demo.wgbcw.com Wed, 04-Apr-2012 13:24:19 GMT
- 6Qvx_2132_lastvisit Sent 1333455830 / demo.wgbcw.com Thu, 03-May-2012 13:23:50 GMT
- 6Qvx_2132_onlineusernum Received 2 / demo.wgbcw.com Tue, 03-Apr-2012 13:29:19 GMT
- 6Qvx_2132_seccodeS8Yb7 Sent 3603fQXUGT3MaqOWQ36XAmwfYd954Z9gKJv7hQvP/wfc0jytZ2jV3bkmjnn69BP4CG9cFO9fFFrpqR8
- 6Qvx_2132_sid Sent h6W4gz / demo.wgbcw.com Wed, 04-Apr-2012 13:24:07 GMT
- 6Qvx_2132_sid Received uxn1U8 / demo.wgbcw.com Wed, 04-Apr-2012 13:24:19 GMT
- 6Qvx_2132_sid Received uxn1U8 / demo.wgbcw.com Wed, 04-Apr-2012 13:24:19 GMT
- 6Qvx_2132_ulastactivity Received 318d BPaCeFfuVMSS6tOIPnAnzEJLiA313CA48xabwVwF5eL3OBp / demo.wgbcw.com Wed, 03-Apr-2013 13:24:19 GMT
复制代码 Content(返回内容):我们这里就粘贴账号信息关键数据就行
[code=php]<p>积分: <a href="http://demo.wgbcw.com/dzx151gbk/home.php?mod=spacecp&ac=credit">16</a> , 威望: <a href="http://demo.wgbcw.com/dzx151gbk/home.php?mod=spacecp&ac=credit" id="hcredit_1">0</a> , 金钱: <a href="http://demo.wgbcw.com/dzx151gbk/home.php?mod=spacecp&ac=credit" id="hcredit_2">16</a> , 贡献: <a href="http://demo.wgbcw.com/dzx151gbk/home.php?mod=spacecp&ac=credit" id="hcredit_3">0</a> , 用户组: <a href="http://demo.wgbcw.com/dzx151gbk/home.php?mod=spacecp&ac=usergroup" id="g_upmine" class="xi2">实习版主</a>
</p>[/code]
Stream(数据流):
GET /dzx151gbk/forum.php HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)
Host: demo.wgbcw.com
Connection: Keep-Alive
Cookie: 6Qvx_2132_lastvisit=1333455830; 6Qvx_2132_sid=h6W4gz; 6Qvx_2132_lastact=1333459455%09misc.php%09seccode; _D_SID=113678A4; 6Qvx_2132_seccodeS8Yb7=3603fQXUGT3MaqOWQ36XAmwfYd954Z9gKJv7hQvP%2Fwfc0jytZ2jV3bkmjnn69BP4CG9cFO9fFFrpqR8; 6Qvx_2132_auth=c970CTDoemKodG0M%2BSh1v2u8gSGUQ3I0EsjtU4PrUFCOxeIUXDQ4s0FS147%2FXp916L1jwEGzyQeMWkYVL%2B6S
根据上面的相关数据不难看出我们取账号信息,只要向服务器发送一条GET请求方式的数据,就可以在返回数据中取账号的信息。在易语言中定义一个子程序“取账号相关信息”及自定义一个“账号信息”的数据类型名的结构。根据上面的Content内容可知,我们要取账号的相关信息,只要在上面文本中查找文本或用正则来取就可以。
经测试还是正则比较方便,有空得多学习下正则了,正则还是弱呀 。把核心代码贴出来给大家参考:
- .版本 2
- .支持库 RegEx
- .子程序 取账号相关信息, , , 第八课中增加
- .局部变量 URL, 文本型
- .局部变量 返回内容, 文本型
- URL = “/dzx151gbk/forum.php”
- GET (URL, 返回内容)
- ' 输出调试文本 (返回内容)
- 处理事件 ()
- .如果 (返回内容 ≠ “”)
- 账号信息.积分 = 取积分 (返回内容)
- 账号信息.威望 = 取威望 (返回内容)
- 账号信息.金钱 = 取金钱 (返回内容)
- 账号信息.贡献 = 取贡献 (返回内容)
- 账号信息.用户组 = 取用户组 (返回内容)
- ' 账号信息.uid = 取UID (返回内容)
- 主窗口.标题 = “UID:” + 账号信息.uid + “积分:” + 账号信息.积分 + “威望:” + 账号信息.威望 + “金钱:” + 账号信息.金钱 + “贡献:” + 账号信息.贡献 + “用户组:” + 账号信息.用户组
- .否则
- .如果结束
- .子程序 取积分, 文本型
- .参数 目标文本, 文本型
- .局部变量 正则, 正则表达式
- 正则.创建 (“积分: <(\S*?)[^>]*>(.*?)</a>”, 假, 真)
- 正则.搜索全部 (目标文本)
- 返回 (正则.取子匹配文本 (1, 2))
- .子程序 取威望, 文本型
- .参数 目标文本, 文本型
- .局部变量 正则, 正则表达式
- 正则.创建 (“威望: <(\S*?)[^>]*>(.*?)</a>”, 假, 真)
- 正则.搜索全部 (目标文本)
- 返回 (正则.取子匹配文本 (1, 2))
- .子程序 取金钱, 文本型
- .参数 目标文本, 文本型
- .局部变量 正则, 正则表达式
- 正则.创建 (“金钱: <(\S*?)[^>]*>(.*?)</a>”, 假, 真)
- 正则.搜索全部 (目标文本)
- 返回 (正则.取子匹配文本 (1, 2))
- .子程序 取贡献, 文本型
- .参数 目标文本, 文本型
- .局部变量 正则, 正则表达式
- 正则.创建 (“贡献: <(\S*?)[^>]*>(.*?)</a>”, 假, 真)
- 正则.搜索全部 (目标文本)
- 返回 (正则.取子匹配文本 (1, 2))
- .子程序 取用户组, 文本型
- .参数 目标文本, 文本型
- .局部变量 正则, 正则表达式
- 正则.创建 (“用户组: <(\S*?)[^>]*>(.*?)</a>”, 假, 真)
- 正则.搜索全部 (目标文本)
- 返回 (正则.取子匹配文本 (1, 2))
-
- .子程序 取UID, 文本型
- .参数 目标文本, 文本型
- .局部变量 正则, 正则表达式
- 正则.创建 (“uid':'(.*?)',”, 假, 真) ' ,'uid':'2',
- 正则.搜索全部 (目标文本)
- 返回 (正则.取子匹配文本 (1, 1))
复制代码
- .版本 2
- .数据类型 账号信息
- .成员 uid, 文本型
- .成员 积分, 文本型
- .成员 威望, 文本型
- .成员 金钱, 文本型
- .成员 贡献, 文本型
- .成员 用户组, 文本型
复制代码 有兴趣的朋友还可以把提醒、短信息等也取出来,这做为一个简单的作业,给大家完成了。
- .版本 2
- .子程序 _按钮5_被单击
- .如果真 (登陆论坛 ())
- 取账号相关信息 ()
复制代码 相关图:
三、代码优化
对于这部分,应该说没有啥好讲了,大家只要让代码增强可读性就可以了,当然对本人而言,也只能说力争让代码更容易读懂,别的代码就不多发了,把POST和GET自定义函数给贴出来:- .版本 2
- .子程序 POST, 字节集, , http post
- .参数 URL, 文本型
- .参数 附加数据, 文本型, , PostData
- .参数 返回内容, 文本型
- .局部变量 请求句柄, 整数型
- .局部变量 协议头, 文本型, , , Headers
- .局部变量 dwByteRead, 整数型
- .局部变量 临时文本, 文本型
- .局部变量 返回数据, 字节集
- .局部变量 临时数据, 字节集
- .如果真 (已创建连接 = 假)
- 初始化句柄 = 取初始化句柄 ()
- .如果 (初始化句柄 ≠ 0)
- 连接句柄 = 取连接句柄 (初始化句柄)
- .否则
- 输出调试文本 (“潇潇编程提示: 初始化WinInet失败”)
- InternetCloseHandle (初始化句柄)
- .如果结束
- .如果真结束
- .如果 (连接句柄 ≠ 0)
- 已创建连接 = 真
- 请求句柄 = 取请求句柄 (“POST”, URL, “HTTP/1.1”)
- .如果 (请求句柄 ≠ 0)
- 协议头 = “Accept:” + Request.Accept + #换行符 + “Accept-Encoding:” + Request.AcceptEncoding + #换行符 + “Accept-Language:” + Request.AcceptLanguage + #换行符 + “Cache-Control:” + Request.CacheControl + #换行符 + “Connection:” + Request.Connection + #换行符 + “Content-Length:” + 到文本 (Request.ContentLength) + #换行符 + “Content-Type:” + Request.ContentType + #换行符 + “Host:” + Request.Host + #换行符 + “Referer:” + Request.Referer + #换行符 + “User-Agent:” + Request.UserAgent
- .如果真 (HttpSendRequest (请求句柄, 协议头, 取文本长度 (协议头), 附加数据, 取文本长度 (附加数据)) = 真)
- 返回数据 = 取空白字节集 (2048)
- .循环判断首 ()
- InternetReadFile (请求句柄, 返回数据, 取字节集长度 (返回数据), dwByteRead)
- 临时数据 = 临时数据 + 取字节集左边 (返回数据, dwByteRead)
- 返回内容 = 返回内容 + 到文本 (取字节集左边 (返回数据, dwByteRead))
- .循环判断尾 (dwByteRead ≠ 0)
- ' 调试窗口.编辑框1.加入文本 (返回内容)
- .如果真结束
- .否则
- 输出调试文本 (“潇潇编程提示:取请求句柄失败”)
- InternetCloseHandle (请求句柄)
- .如果结束
- .否则
- 输出调试文本 (“潇潇编程提示: 取请求句柄 失败”)
- 已创建连接 = 假
- InternetCloseHandle (连接句柄)
- .如果结束
- 返回 (临时数据)
- .子程序 GET, 字节集, , http get
- .参数 URL, 文本型
- .参数 返回内容, 文本型
- .局部变量 请求句柄, 整数型
- .局部变量 协议头, 文本型, , , Headers
- .局部变量 dwByteRead, 整数型
- .局部变量 临时文本, 文本型
- .局部变量 临时数据, 字节集
- .局部变量 返回数据, 字节集
- .如果真 (已创建连接 = 真)
- 请求句柄 = 取请求句柄 (“”, URL, “HTTP/1.1”) ' 第一参数为空或者"GET"
- .如果 (请求句柄 ≠ 0)
- 协议头 = “Accept:*/*” + #换行符 + “Accept-Encoding:” + Request.AcceptEncoding + #换行符 + “Accept-Language:” + Request.AcceptLanguage + #换行符 + “Connection:” + Request.Connection + #换行符 + “Host:” + Request.Host + #换行符 + “Referer:” + Request.Referer + #换行符 + “User-Agent:” + Request.UserAgent + #换行符 + “x-requested-with:XMLHttpRequest”
- .如果真 (HttpSendRequest (请求句柄, 协议头, 取文本长度 (协议头), “”, 0) = 真)
- 返回数据 = 取空白字节集 (2048)
- .循环判断首 ()
- InternetReadFile (请求句柄, 返回数据, 取字节集长度 (返回数据), dwByteRead)
- 临时数据 = 临时数据 + 取字节集左边 (返回数据, dwByteRead)
- 返回内容 = 返回内容 + 到文本 (取字节集左边 (返回数据, dwByteRead))
- .循环判断尾 (dwByteRead ≠ 0)
- ' 调试窗口.编辑框1.加入文本 (返回内容)
- .如果真结束
- .否则
- 输出调试文本 (“潇潇编程提示:取请求句柄失败”)
- 返回 (临时数据)
- InternetCloseHandle (请求句柄)
- .如果结束
- .如果真结束
- 返回 (临时数据)
复制代码
补充(2012.4.5):在第十条数据里:
- + 0.374 0.191 470 214 GET 304 image/gif http://www.wgbcw.com/dzx151gbk/uc_server/images/noavatar_small.gif
复制代码
这是Content(返回内容)中为论坛默认的头像,因没上传头像所以就显示默认的。另外上面的域名又变成了www开头的,当然我们在用HttpWatch实际获取的路径是demo.wgbcw.com,这里为何会变了,估计是论坛设置里出了问题,当然这点相对来说并不重要。大家在分析数据时,注意“/dzx151gbk/uc_server/images/noavatar_small.gif”,这是获取账号头像的URL。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|