未完待续,对高校体育的研究都会在这篇Blog里写完,想到了就会补上来。
接口相关资料和所有程序都在我的码云
在线访问地址:https://www.spencercjh.top:8090/fastrun/
目录
更新 2019年3月10日
对方服务器改了host,代码估计也更了,这个项目已经过时了,但http报文分析的流程是永不过时的。希望能够帮助到大家。
声明
本文谨为对上海微摇网络科技有限公司出品的高校体育(Android App)的接口自动化测试。
鸣谢
感谢CSDN用户@留白大人的BLOG,感谢GITHUB用户@RyuBAI的开源分享和某不愿透露姓名的同学的指导。
摘要
**对上述接口进行自动化“测试”。输入手机、密码、开始跑步时间、结束跑步时间、距离、性别就能输出上传跑步数据结果。
接口相关资料和所有程序都在我的码云
相关真实Session
我会把每次手动测试的结果放在这里…SAZ用Fidder打开
开始
我的“自动化测试程序”是一个Api,基于Spring Boot 2.X,这里并不会细讲如何搭建部署一个Spring Boot环境(偏题),也不会细讲每一行代码是干嘛的(我觉得我的代码已经挺优美的了,首先完全阿里巴巴Java开发规范:D)
环境
源码
去这里看核心源码,有bug的话就会更。
问题
问题1 Header是有区别的
POST saveRunV2的Header和其他2个GET请求的Header是不一样的,多了两个字段。我编码的时候以为是一样的…
问题2 POST请求中不要把body中的data URLEncoder
GET里要把参数URLEncoder才能放上url,POST里可不行……
问题3 如何修改数据包
我的思路是:先把我准备好的数据包转成一个JSONObject A,把其中我需要的、可以重复使用的信息(比如tNode、track、trend,这些数据都只是用来渲染地图用的,不做校验)放入新的、最后要上传的JSONObject B。可能是我对 com.alibaba.fastjson的Api不太熟悉,我总觉得应该有更好的方法。
问题4 localhost与服务器运行时发生不同状况
- paramData.setCookie(String.valueOf(cookie.get(0))); 本地不报错 服务端空指针
- data.put(DURATION, String.valueOf((DateFormat.getDateTimeInstance().parse(startTime).getTime())-DateFormat.getDateTimeInstance().parse(endTime).getTime() / 1000)); 本地不报错,服务端转换失败
第一个问题可以理解;
第二个问题很难理解,我服务端也是Java8啊,tomcat8.5,怎么会本地远程不一呢???不过也无伤大雅,写死就完事了。
问题5 朋友用杉达的账号测,发现途经点数据异常了
runPage里gpsinfo里的选到点也要放进数据包,不能乱写。将runPage里的gpsinfo全部替换跑步数据里的tNode。服务端会根据学校来校验经过点。
问题6 定时器自动执行
2018年10月15日更新每日定时跑步
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import spencercjh.top.fastrun.serviceimpl.FastRunServiceImpl;
import spencercjh.top.fastrun.entity.ParamData;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import static spencercjh.top.fastrun.common.constant.CommonConstant.*;
/**
* @author spencercjh
*/
@Component
@Log4j2
public class FastRunSchedule {
private final FastRunServiceImpl fastRunServiceImpl;
@Autowired
public FastRunSchedule(FastRunServiceImpl fastRunServiceImpl) {
this.fastRunServiceImpl = fastRunServiceImpl;
}
/***
* 每天早上8点钟执行一次
*/
@Scheduled(cron = "0 0 8 * * *")
public void fastRunEveryDay() {
ParamData paramData = new ParamData();
try {
fastRunServiceImpl.login(paramData, MOBILE_VALUE, PASSWORD_VALUE);
fastRunServiceImpl.runPage(paramData);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, HOUR_VALUE);
calendar.set(Calendar.MINUTE, MINUTE_VALUE_1);
calendar.set(Calendar.SECOND, SECOND_VALUE);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String startTime = dateFormat.format(calendar.getTime());
calendar.set(Calendar.MINUTE, MINUTE_VALUE_2);
String endTime = dateFormat.format(calendar.getTime());
fastRunServiceImpl.saveRun(paramData, startTime, endTime, DISTANCE, ISGIRL, FREQUENCY, PACE, DURATION_VALUE);
} catch (Exception | Error e) {
e.printStackTrace();
log.error(paramData.getResult());
}
log.info(paramData.getResult());
}
}
问题7 utoken根本不验证
如图所示,我登陆都没成功,竟然就能直接访问runPage这个接口,我真的仏了:
结果
在线访问地址:https://www.spencercjh.top/fastrun
保存成功
超出限制
登陆失败
交流
对RunController有什么问题的可以shouspencercjh@foxmail.com联系我,在Blog里我不会回复。
总结
- 我就当是来熟悉一下cn.hutool.http的使用,JSON的处理和Spring Security的简单使用。
- 以此反思,如何保障自己开发的系统的Api的安全。
- 这公司太傻了……太懒了……
- 数据加密:高校体育App只有在request中进行了请求保护(sign),但数据没有加密(data明文);response开诚布公。
- 更安全的登陆状态校验:我不知道它用的什么,我看一直在发uuid-utoken,JWT肯定比这个强,我自己用过试过。
- 客户端做不好保护就别放关键信息。