场景
大家的应用处于安全考虑,又没有加密呢?又没用一个一个加密参数做验证呢?如果没有那你们就太low了(当然对于懂逆向的这些都没啥用处),如果有你是如何做的呢?
为何做验证
处于安全考虑,http请求都是可以通过抓包工具抓取下来的(Fiddler),抓取下来,我就可以通过模拟请求发送你们的请求,做一款外挂,大伙也可以试试,抓别人的包,然后请求即可...,一般来说如何做呢?就是对一个参数经过一系列算法,然后服务端口回去验证此算法是否正确
流程图
实现逻辑
通过okhttp的拦截器,拦截请求体,对请求体做对应添加数据
所有请求添加请求头拦截器定义
private Interceptor getHeaderIntercepter() { return new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); request=request.newBuilder() .addHeader("myHeader", "ok") .addHeader("myHeader", "ok2") .build(); Response response = chain.proceed(request); return response; } }; }
From表单添加所有参数
private Interceptor getFromIntercepter() { return new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); //参数就要针对body做操作,我这里针对From表单做操作 if (request.body() instanceof FormBody) { // 构造新的请求表单 FormBody.Builder builder = new FormBody.Builder(); FormBody body = (FormBody) request.body(); //将以前的参数添加 for (int i = 0; i < body.size(); i++) { builder.add(body.encodedName(i), body.encodedValue(i)); } //追加新的参数 builder.add("newKye", "newValue"); request = request.newBuilder().post(builder.build()).build();//构造新的请求体 } Response response = chain.proceed(request); return response; } }; }
GET请求追加参数
private Interceptor getGetParameterIntercepter() { return new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (request.method().equals("GET")) { //如果是get请求 HttpUrl url = request.url(); HttpUrl newUrl = url.newBuilder() .addEncodedQueryParameter("newKey", "newValue") .addEncodedQueryParameter("newKey2", "newvalue2") .build(); request = request.newBuilder() .url(newUrl).build(); } Response response = chain.proceed(request); return response; } }; }
万能请求加参数方法(例如JSON的post请求)
private Interceptor getAddPIntercepter() { return new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); RequestBody body = request.body();// 得到请求体 Buffer buffer = new Buffer();// 创建缓存 body.writeTo(buffer);//将请求体内容,写入缓存 String parameterStr = buffer.readUtf8();// 读取参数字符串 //如果是json串就解析 从新加餐 如果是字符串就进行修改 具体业务逻辑自己加 //对应请求头大伙按照自己的传输方式 定义 RequestBody requestBody = RequestBody.create(MediaType.parse("text/x-markdown; charset=utf-8"), parameterStr); request = request.newBuilder().patch(requestBody).build(); Response response = chain.proceed(request); return response; } }; }
总结
关于修改参数,可以从okhttp的拦截器做处理,也可以从Retrofit层做处理,如果是Retrofit层可以通过,自定义ConverterFactory,对请求数据转换,不嫌弃可以我的这个文章:点击打开链接