場景
大家的應用處於安全考慮,又沒有加密呢?又沒用一個一個加密參數做驗證呢?如果沒有那你們就太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,對請求數據轉換,不嫌棄可以我的這個文章:點擊打開鏈接