V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
CoolSpring
V2EX  ›  奇思妙想

有没有将 CGI Proxy 转化为普通 HTTP Proxy 的工具呢?

  •  
  •   CoolSpring · 2020-05-10 22:41:53 +08:00 · 2617 次点击
    这是一个创建于 1688 天前的主题,其中的信息可能已经有所发展或是发生改变。

    根据 Wikipedia,CGI Proxy 的定义是“A CGI web proxy accepts target URLs using a Web form in the user's browser window, processes the request, and returns the results to the user's browser.”( CGI 代理使用浏览器中的 Web 表单接受目标 URL,处理请求,并将结果返回给用户浏览器。)

    我们学校使用的是深信服的 SSLVPN 产品,对于在校外接入校园网环境的需求,提供了两种方式——

    1. 使用 EasyConnect 客户端,然而这个客户端的风评不怎么好;
    2. 手机版访问 https://rvpn.zju.edu.cn ,登录后可以得到这样一个界面: https://i.loli.net/2020/05/10/x6LkImzYV1QD2Pq.png 。再输入网址例如 cnki.net ,点击“访问”会跳转到这样的 URL 格式 https://rvpn.zju.edu.cn/web/1/https/0/cnki.net/ 。所以这大概是可以归为上面所述的 CGI Proxy 一类。

    于是突然有一个想法:可不可以通过在本地运行一个程序伪装成 HTTP Proxy,把请求转发给方法 2 的这个 CGI Proxy 呢?

    浏览器 <--(普通的 HTTP 代理请求)--> 表现为 HTTP Proxy 的转发程序 <--(附带上验证所需的 Cookie 的 Web 请求)--> CGI Proxy <----> 校内网站

    具体需求:

    1. 读浏览器发送的请求 1,从中抽取 Method, URL, Headers, Cookies
    2. 向原请求 1 的 Cookies 加入一个形如 "TWFID=xxxxxxxxx" 的通过验证用的 Cookie 之后,将这个请求 2 转发到 https://{Web_Portal_Endpoint}/web/1/http(s)/0/{URL} (或者说是新生成一个请求 2,总之达到目的即可)
    3. 读请求 2 返回的内容,进行一定的过滤处理(这个网页版 SSLVPN 会插入一些 JS 文件和 HTML Tag,原本是为了 URL Rewrite,但有时这些脚本会影响网页的正常功能,因此需要去除,也可以去除)之后将改动后的 Response 发回给浏览器。

    目前用 Uvicorn + Requests 已可以实现简单的 HTTP GET/POST 请求转发,但是不支持 HTTPS,因为 HTTPS 需要用到 CONNECT 方法,而我不知道它在我这种情景下该如何实现。

    所以来请教大家,我的这种想法有没有现成的工具呢?或者说,应该从哪个抽象的层级入手(单从 Python 来说,查到了 socket, h11, twisted 等库不知如何选择。它们的封装程度各不相同,想要能达到目标却又不想涉及到太繁杂的无关的底层处理)

    3 条回复    2020-06-23 22:23:32 +08:00
    oott123
        1
    oott123  
       2020-05-11 00:48:51 +08:00 via Android
    这应该不是 CGI Proxy,更像是一种 reverse proxy,即反向代理

    现成工具没有听说过
    Latin
        2
    Latin  
       2020-05-11 09:52:57 +08:00
    先抓包,一般这种 vpn 大多走的都是 pac
    CoolSpring
        3
    CoolSpring  
    OP
       2020-06-23 22:23:32 +08:00
    引入 elazarl/goproxy 再拼拼凑凑,基本上针对我的需求是可用了……
    供参考: https://github.com/CoolSpring8/rwppa/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   999 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:49 · PVG 05:49 · LAX 13:49 · JFK 16:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.