成对的数据流处理经验
目录
HTTP数据都是成对的,一个request对应一个response. 下面介绍怎么从数据流(回调方式)中处理这种数据。
Burp的插件开发,调用的接口是一个回调函数——processHttpMessage,它可以接收请求,拦截请求,修改请求,拿到整体的请求和响应。
问题总结:
- 数据流顺序不确定:正常的“请求-响应”顺序可能被打乱,例如出现 12121122 这样的序列。
- 需要状态缓存:因为回调是“无状态”的,必须自己维护一个缓存,来暂存先到达的请求,等待其对应的响应到达后,再将两者“配对”处理。
代码思路:
- 在得到request的时候,不做处理;
- 在得到response的时候,一并将request和response一起存储,并传递出去;
案例
Burp插件开发举例:
// 定义两个Map,一个存储单独的请求,一个存储请求-响应对
private Map<String, IHttpRequestResponse> requestCache = new HashMap<>();
private Map<String, Pair<IHttpRequestResponse, IHttpRequestResponse>> fullRequestResponse = new HashMap<>();
/**
* 功能: 监听HTTP proxy模块的流量,根据配置去做匹配,并高亮显示
*
* @param i —— 区分什么是什么Burp模块过来的数据;
* @param b —— boolean b(messageIsRequest)这个参数是用来判断当前传入的messageInfo对象是HTTP请求还是HTTP响应;
* @param iHttpRequestResponse —— 一个结构体,存储了请求和响应属性;
*/
@Override
public void processHttpMessage(int i, boolean b, IHttpRequestResponse iHttpRequestResponse) {
if (b) { // 是请求
// 可以不做任何事,或者仅做记录
} else { // 是响应
// 直接从 IHttpRequestResponse 对象中提取请求部分
IHttpRequestResponse request = iHttpRequestResponse;
// 注意:在响应回调中,iHttpRequestResponse 本身就包含了请求和响应
// 您可以直接使用 iHttpRequestResponse 来获取请求数据
// byte[] requestBytes = iHttpRequestResponse.getRequest();
// byte[] responseBytes = iHttpRequestResponse.getResponse();
// 然后进行配对处理
}
}
浙公网安备 33010602011771号