长沙理工大学教务管理系统模拟登陆
准备
浏览器抓包设置
按F12开启浏览器抓包。
选择Network选项,并记得选上Preserve log选项,否则页面一旦跳转,之前抓的包就会消失。
开始抓包
通过对首页进行刷新抓包,我抓到了以下数据包。
通过对数据包的逐个观察,我选出了首页数据包里的三个关键包。
一个是登陆界面的数据包,里面包含了完整的登陆Form表。
根据登陆界面的代码分析得出表单的上传还需要一些加密方法,“加密算法数据包”
一个是验证码的数据包。
随后我们再对登陆过程进行抓包。一般登陆表都是采用POST的方式上传。(此时如果没有选上Preserve log选项,将观察不到登陆数据包)
由下图可知服务器的请求地址(Requesst URL)和请求方式(Request Method)
登陆数据包携带的数据(From Data)
开始数据包分析
在上面我们抓了四个数据包,分别是登陆界面包,加密算法包,验证码包,登陆包。现在进行详细分析。
登陆界面包
登陆界面包的请求地址和请求方式
请求头
请求头里重要的参数有Cookie、Referer和User-Agent,其它参数可加可不加。
我们的最终目标就是要获取一个已登陆的Cookie。
Referer是一个服务器需要验证的参数,如果没有,服务器将返回“系统出错”等。
User-Agent是为了降低被后台识别为爬虫的几率。
加密算法包
根据登陆界面代码里的具体加密方法调用逻辑来使用。
验证码包
请求地址和请求方式
请求头
登陆包
请求地址和请求方式,可以注意到登陆包和登陆界面包的请求地址是一样的,但请求方式不同。
请求头
Form Data
结合登陆界面的代码分析可得下表
参数名 | 参数值来源 |
---|---|
__VIEWSTATE | 登陆界面代码中匹配,会变化 |
__VIEWSTATEGENERATOR | 登陆界面代码中匹配,会变化 |
pcInfo | 直接复制包数据即可 |
txt_mm_expression | 字符串空值"" |
txt_mm_length | 字符串空值"" |
txt_mm_userzh | 字符串空值"" |
typeName | 点击From Data旁的view URL encoded可得值"%D1%A7%C9%FA" ,使用gb2312进行UrlDecode解码可得知该值实际为"学生" |
dsdsdsdsdxcxdfgfg | 加密后的密码,具体加密方式可以在登陆界面代码中看到,使用的加密算法在首页抓包中的md5.js中 |
fgfggfdgtyuuyyuuckjg | 加密后的验证码,具体加密方式可以在登陆界面代码中看到,使用的加密算法在首页抓包中的md5.js中 |
Sel_Type | 可以从登陆界面代码的登录表得知有多个值可选,一般为STU |
txt_asmcdefsddsd | 学号 |
txt_pewerwedsdfsdff | 字符串空值"" |
txt_psasas | 同typeName可得值为“请输入密码” |
txt_sdertfgsadscxcadsads | 字符串空值"" |
代码实现
接下来是具体的代码实现,我选择使用Java和Jsoup来构造。模拟登陆实质是模拟数据包发送接收和处理,使用哪种语言看个人爱好。
public static Map<String, String> cookies = null;//用来存放Cookie
public static final String validateCodeUrl = "http://xk.csust.edu.cn/sys/ValidateCode.aspx";//验证码请求地址
public static final String pcinfo = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36undefined5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 SN:NULL";
public static final String loginPanelUrl = "http://xk.csust.edu.cn/_data/login_home.aspx";//登陆界面请求地址
public static Map<String, String> datas = new HashMap<String, String>();//要Post的数据
密码加密
public static String getPassword(String username, String password) {
ScriptEngineManager manager = new ScriptEngineManager();//Java自带可以解析Js文件的类
ScriptEngine engine = manager.getEngineByName("javascript");
try {
File file = new File("E:/jee-2019-032/work-space/hhh/src/hhh/md5.js");
// 读取js
FileReader fileReader = new FileReader(file);
// 执行指定脚本
engine.eval(fileReader);
if (engine instanceof Invocable) {
Invocable in = (Invocable) engine;
return (in.invokeFunction("md5", username
+ in.invokeFunction("md5", password).toString().substring(0, 30).toUpperCase() + "10536")
.toString().substring(0,