jsproxy

基于浏览器端 JS 实现的在线代理
授权协议 MIT
开发语言 JavaScript
所属分类 服务器软件、 代理服务器软件
软件类型 开源软件
地区 国产
投 递 者 马泓
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

jsproxy 是一个基于浏览器端 JS 实现的在线代理

安装

curl https://raw.githubusercontent.com/EtherDream/jsproxy/master/i.sh | bash
  • 自动安装目前只支持 Linux x64,并且需要 root 权限

  • 安装过程中 80 端口能被外网访问(申请 HTTPS 证书)

无法满足上述条件,或想了解安装细节,可尝试手动安装

测试: https://服务器IP.xip.io:8443(具体参考脚本输出)

部署

Fork 本项目,进入 gh-pages 分支,编辑 conf.js 文件:

  • 节点列表(node_map 字段,包括节点 id 和节点主机)

  • 默认节点(node_default 字段,指定节点 id)

访问 https://用户名.github.io/jsproxy 预览。

GitHub 支持自定义域名。也可以将文件发布到自己的 Web 服务器上。

维护

# 切换到 jsproxy 用户
su - jsproxy

# 重启服务
./run.sh reload

# 关闭服务(参数和 nginx -s 相同)
./run.sh quit

# 启动服务
./run.sh

# 查看代理日志
tail server/nginx/logs/proxy.log

目前暂未实现开机自启动。

禁止外链

默认情况下,代理接口允许所有 github.io 子站点调用,这可能导致不必要的流量消耗。

如果希望只给自己网站使用,可编辑 allowed-sites.conf。(重启服务生效)

安全策略

如果不希望代理访问内网(避免 SSRF 风险),可执行 setup-ipset.sh

/home/jsproxy/server/setup-ipset.sh

需要 root 权限,依赖 ipset 命令

该脚本可禁止 jsporxy 用户访问保留 IP 段(针对 TCP)。nginx 之外的程序也生效,但不影响其他用户。

项目特点

相比传统在线代理,本项目具有以下特点:

服务端开销低

传统在线代理几乎都是在服务端替换 HTML/JS/CSS 等资源中的 URL。这不仅需要对内容做大量的分析和处理,还需对流量进行解压和再压缩,消耗大量 CPU 资源。并且由于逻辑较复杂,通常使用 Python/PHP 等编程语言自己实现。

为降低服务端开销,本项目使用浏览器的一个黑科技 —— Service Worker。它能让 JS 拦截网页产生的请求,并能自定义返回内容,相当于在浏览器内部实现一个反向代理。这使得绝大部分的内容处理都可以在浏览器上完成,服务器只需纯粹的转发流量。

因此本项目服务端直接使用 nginx,并且转发过程不修改内容(只修改 HTTP 头),避免了内容处理产生的巨大开销。同时得益于 nginx 丰富的功能,很多常用需求无需重新造轮子,通过简单配置即可实现。并且无论性能还是稳定性,都远高于自己实现。

API 虚拟化

传统在线代理大多只针对静态 URL 的替换,忽视了动态 URL 以及和 URL 相关的网页 API。例如 a.com 反向代理 google.com,但页面中 JS 读取 document.domain 得到的仍是 a.com。这可能导致某些业务逻辑出现问题。

为缓解这个问题,本代理在页面头部注入一个 JS,用以重写绝大部分和 URL 相关的 API,使得页面中的 JS 获取到的仍是原始 URL:

对于有些无法重写的 API,例如 location,本代理会将代码中字面出现的 location 替换成 __location,从而将操作转移到自定义对象上。当然对于非字面的情况(例如 this['lo' + 'cation']),目前还无法处理。

  • Js中Proxy对象 Proxy对象用于定义基本操作的自定义行为,例如属性查找、赋值、枚举、函数调用等。 语法 const proxy = new Proxy(target, handler); target: 要使用Proxy包装的目标对象,可以是任何类型的对象,包括原生数组,函数,甚至另一个代理。 handler: 一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理pr

  • vue2.0是的数据响应式是基于Object.defineProperty的方式来实现的,到了vue3.0,尤雨溪就把它改成用Proxy代理的方式来实现数据响应式。 Proxy的定义:代理的意思。就是你想要对数据进行操作,必须经过代理,让代理去帮你操作数据,你只需要对代理发号施令就可以了。相当于Proxy就是你的管家,你想买什么吃的,就跟管家说,管家会帮你去买。 使用Proxy: const ta

  • 在使用Ant Design Pro时候,服务器端使用了自己keytool生成的证书,在config/config.js 设置代理请求的时候报错: [HPM] Error occurred while trying to proxy request /myapi/user/login from localhost:8000 to https://localhost:8443 (SELF_SIGN

  • Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。 语法 // target: 要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。 // handler: 一个对象,该对象的属性值通常是函数,定义了代理各种操作时p的行为。对象上的属性名是特定且可选的,如果没有某个属性,就会保留源对象的默认行为

  • JS代理Proxy对象的使用 <div id="person"></div> <script> const person = { name: "Tom", }; // 设置值的时候,界面显示也随之变化 const handler = { set: function (obj, prop, value) { obj[prop] = value;

  • 配置代理:基础   devServer: {     proxy: {       // 配置多个代理(配置一个 proxy: 'http://localhost:4000' // 本地模拟数据服务器)       "^/v1": {         target: "https://monitor-api.xxx", //         ws: true,         changeOrig

  • 参考 https://coderschool.cn/3296.html

 相关资料
  • 本文向大家介绍基于js实现判断浏览器类型代码实例,包括了基于js实现判断浏览器类型代码实例的使用技巧和注意事项,需要的朋友参考一下 前言 工作中需要用到判断浏览器类型,网上找到的内容不怎么全,故在此进行一下总结。 一、不同浏览器及版本下User-Agent信息 待续.....欢迎补充 二、根据User-Agent信息进行判断 以下代码目前还判断不了win10下的edge 以上就是本文的全部内容,希

  • 本文向大家介绍JS实现浏览上传文件的代码,包括了JS实现浏览上传文件的代码的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴代码了,具体代码如下所示: 总结 以上所述是小编给大家介绍的JS实现浏览上传文件的代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

  • 本文向大家介绍如何基于js判断浏览器版本,包括了如何基于js判断浏览器版本的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了如何基于js判断浏览器版本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 浏览器类型判断 不考虑对 IE9 以下浏览器的判断 测试 判断IE浏览器的版本 包含edge,ie11,10,9,8,7,6,5,4 判断浏

  • 现在相信很多团队的代码都是直接用 ES2015+ 语法来编写和维护,然后通过 Babel 将 ES2015+ 语法转成支持老浏览器的 js 代码,经过转换后的 js 代码从体积和解析执行效率上都比转换前有损耗。 兼容性 从 Caniuse 网站的数据来看,现在绝大多数的浏览器已经对 ES2015+有了很好的支持,而经过我们统计百度 APP 的 Webview 浏览器数据来看,国内大概有 74.71

  • 我正在研究SAML和SSO,看起来使用SAML的应用程序需要是一个web应用程序,并且依赖于浏览器。 有人能告诉我为什么吗? 我对SAML的有限知识告诉我,SAML依赖于会话和cookie,这在桌面应用程序或移动应用程序中是不可用的。这是唯一的原因吗?你能告诉我更多的细节吗?

  • 本文向大家介绍JS实现的跨浏览器解析XML文件实例,包括了JS实现的跨浏览器解析XML文件实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS实现的跨浏览器解析XML文件的方法。分享给大家供大家参考,具体如下: 下列代码把一个 XML 文档 ("note.xml") 载入 XML 解析器中: PS:关于xml格式文件,小编这里再来为大家推荐几款在线工具,相信大家在今后的编程开发中可以用

  • 主要内容:控制台界面,数据包抓取,看变化规律几乎所有浏览器都提供了抓取数据包的功能,因为浏览器为抓包提供了一个专门的操作界面,因此这种抓包方式也被称为“控制台抓包”。本节以 Chrome 浏览器为例进行抓包演示。 控制台抓包指的是利用浏览器开的发者调试工具抓取客户端与后端服务器交互的数据,它能够将网络传输中发送与接收的数据进行截获、重发和编辑。 控制台抓包非常适合于 POST 请求类型。我们知道,POST 请求使用 Form 表单向服务器提

  • 本文向大家介绍基于d3.js实现实时刷新的折线图,包括了基于d3.js实现实时刷新的折线图的使用技巧和注意事项,需要的朋友参考一下 先来看看效果图 下面直接上源代码,html文件 lineChart.js负责加载和刷新折线图 刚开始数据刷新了但是坐标轴木有刷新 引入 以上就是d3.js实现实时刷新折线图的全部内容,希望给大家学习d3.js带来帮助。