文档章节

Java代理服务器之截取,篡改HTTP请求。

jlcao
 jlcao
发布于 2015/09/11 11:07
字数 838
阅读 744
收藏 2

JAVA实现网络请求代理之HTTP篇 (一)

JAVA实现网络请求代理之Socket篇(二)

Java代理服务器之截取,篡改HTTP请求(应用篇)


说到篡改请求,其实就是篡改底层的一些数据包,就是替换数据包里面的一些数据而已。

前面我们开发了一个HTTP代理服务器,在里面我们是通过转发的方式来实现的,说白了,就是所有的数据都经过了这个代理服务器进行转发,既然数据都了我们的手上了,那么截取,发到别的地方,或者篡改,还不是手到擒来的事。

下面我就实现一个简单的篡改功能,希望大家举一反三。对大家的学习有帮助。

看过HTTP请求代理服务器博文的同学继续往下面看,没看过的同学请先看那片博文

首先我们需要一个Map<String,String> ,这个里面保存的就是我们需要替换的字符串,其中Key代表原本的字符串,value代表需要替换的字符串。

这个私有对象是保存在 HTTPServerThread 类里面的

private static Map<String, String> filter = new HashMap<String, String>();

还有就是添加一个替换的方法,和一个设置上面map 的方法

/**
 * 替换数据 - 篡改数据
 * @param buf
 */
private byte[] replease(byte[] buf) {
    String tmp = new String(buf);
    for (String key : filter.keySet()) {
        if(tmp.contains(key)) {
            tmp=tmp.replace(key,filter.get(key));
        }
    }
    return tmp.getBytes();
}

public static void put(String str, String rep) {
    filter.put(str, rep);
}

然后就是改造我们的doGet方法,将我们的replease方法加进去

/**
 * 处理GET请求
 * @param buf    缓冲区
 * @param creadlen    客户端读取buf的长度
 * @param sin       服务端输入流
 * @param cout      客户端输出流
 * @param sout      服务端输出流
 * @return
 * @throws IOException
 */
private int doGet(byte[] buf, int creadlen, DataInputStream sin, DataOutputStream cout, DataOutputStream sout) throws IOException {
    int sreadlen;// 如读到 GET 请求,向外网发出 GET 请求
    System.out.println("[get] >> " + new String(buf));
    write(buf, creadlen, sout);
    while ((sreadlen = sin.read(buf, 0, 10000))!=-1) { // 循环
        try {
            if (sreadlen > 0) {
                //替换内容
                byte [] tmp = replease(buf);
                write(tmp, tmp.length, cout);
            }
        } catch (Exception e) {
            break;
        } // 异常则退出
    }
    return sreadlen;
}

接下来替换post方法

/**
 * 处理POST 请求
 * @param buf   数据缓存区
 * @param creadlen   客户端读取的buf的长度
 * @param sreadlen    服务端读取的buf的长度
 * @param cin        客户端输入流
 * @param sin        服务端输入流
 * @param cout       客户端输出流
 * @param sout       服务端输出流
 * @throws IOException
 */
private void doPost(byte[] buf, int creadlen, int sreadlen, DataInputStream cin, DataInputStream sin, DataOutputStream cout, DataOutputStream sout) throws IOException {
    write(buf, creadlen, sout);
    // 建立线程 , 用于从外网读数据 , 并返回给内网客户端
    HTTPChannel thread1 = new HTTPChannel(sin, cout);
    while ((sreadlen = cin.read(buf, 0, 10000))!=-1) { // 循环
        try {
            System.out.println("post>>"+new String(buf));
            if (sreadlen > 0) { // 读到数据 , 则发送给外网

                write(replease(buf), sreadlen, sout);
            }
        } catch (Exception e1) {
            break;
        }
    }
}

到现在为止,我们就可以替换请求数据包里面的数据了

需要替换什么直接put到Map里面就可以了。

至于截取数据包转发到其地址,就是在发送数据的时候,顺带发一份到其他的地址,还是很简单的,就留给你们自己实现咯。

© 著作权归作者所有

jlcao
粉丝 2
博文 6
码字总数 4620
作品 0
南岸
程序员
私信 提问
解决Fiddler不能监听Java HttpURLConnection请求的方法

在默认情况下,Fiddler不能监听Java HttpURLConnection请求。究其原因,Java的网络通信协议栈可能浏览器的通信协议栈略有区别,Fiddler监听Http请求的原理是在应用程序和操作系统网络通信层之...

小克898
2013/05/18
346
0
SpringBoot 整合 oauth2(五)实现 jwt 及 扩展

什么是jwt,即 json web token。JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。也是一种token,但是和token有一些不同。 jwt优点: 自包含 防篡改 可自定义扩展 JW...

FantJ
2018/05/22
0
0
使用Fiddler监听Java HttpURLConnection请求的小技巧

参考资料 默认情况下Fiddler是不能监听Java HttpURLConnection上的HTTP请求的。原因容易理解,Fiddler能监听浏览器的HTTP请求是因为它启动一个代理服务器,浏览器通过这个代理服务器上网,但...

chenming
2014/05/07
3.3K
1
net::ERR_INCOMPLETE_CHUNKED_ENCODING(failed)

用flash请求一个http请求,返回 json结构的数据,用火狐访问没问题,用谷歌浏览器内核的访问就报net::ERR_INCOMPLETE_CHUNKED_ENCODING(failed),请问大神这是什么问题呀?服务器用了代理n...

行者爷爷
2017/03/25
11.6K
1
Java中HttpURLConnection使用代理服务器

Properties prop = System.getProperties(); // 设置http访问要使用的代理服务器的地址 prop.setProperty("http.proxyHost", "代理服务器地址"); // 设置http访问要使用的代理服务器的端口 ......

widely
2013/10/31
8K
3

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
38分钟前
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部