【electron】【附排查清单】记录一次逆向过程中,fetch无法请求http的疑难杂症(net::ERR_BLOCKED_BY_CLIENT)

▒ 目录 ▒

    • 🛫 导读
      • 需求
      • 开发环境
    • 1️⃣ Adblock等插件拦截
    • 2️⃣ 【失败】Content-Security-Policy
      • 启动服务器json-server
      • html中的meta字段
    • 3️⃣ 【失败】https vs http
      • webPreferences & allowRunningInsecureContent
      • disable-features
    • 4️⃣ 【失败】检测fetch
      • fetch被魔改了
    • 5️⃣ 【失败】使用axios
      • 插入axios库
    • 6️⃣ 【成功】require('http')
    • 7️⃣ 【完美解决】取消webRequest.onBeforeRequest
    • 🛬 文章小结
    • 📖 参考资料

🛫 导读

需求

逆向某electron应用,需要在其中执行http请求,结果返回错误net::ERR_BLOCKED_BY_CLIENT,为了解决该问题,又遇到无数其它问题,特此记录,以敬后效。

开发环境

版本号描述
文章日期2023-11-07
操作系统Win10 - 22H219045.3570
示例工作目录J:\_ALL\JOB\sw\_nginx\map-ys执行json-server服务器

1️⃣ Adblock等插件拦截

搜索net::ERR_BLOCKED_BY_CLIENT,网上给出最多的结论就是各种插件拦截。可是小编用的软件,在dev tools中很明显没有加载任何插件。
也查了很多dev tools选项,修改后都没有解决问题。

2️⃣ 【失败】Content-Security-Policy

紧接着,查到的就是CORS(Cross-Origin Resource Sharing),也就是传说中的跨域问题。

启动服务器json-server

这里先说下,小编用的是json-server搭建的服务器,启动命令为:json-server -p 16010 db.json -s .

请求的js语句为fetch('http://127.0.0.1:16010/posts')

html中的meta字段

参考文章《MDN:CSP https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP》,我们可以知道,html中的meta会设置CSP,目标应用的内容如下:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' 'unsafe-eval' * blob: data:">
我们可以看出,它并不包含目标地址127.0.0.1:16010,于是执行了下述两种尝试:

  1. 将目标请求地址给它加上去,如下所示:
    <meta http-equiv="Content-Security-Policy" content="default-src 'self' 127.0.0.1 http://127.0.0.1:16010 127.0.0.1:16010 'unsafe-inline' 'unsafe-eval' '*' * https: http: blob: data:">
  2. 删除上述meta项。

重新编译打包后测试,依然不能成功。

3️⃣ 【失败】https vs http

目标electron应用本身需要请求https,小编请求的是http,于是猜测应用对http做了限制。
于是增加了下面两次尝试,均以失败告终。

webPreferences & allowRunningInsecureContent

参考文章《electron配置允许跨域(前端解决方案) https://blog.csdn.net/sinat_39826352/article/details/108537797》
将main.js中,所有的webPreferences对象增加下面属性。

new BrowserWindow({webPreferences:{//网页功能的设置// nodeIntegration: true,//是否集成node// devTools:false,//是否开启 DevToolswebSecurity: false, //是否禁用同源策略(上线时删除此配置)allowRunningInsecureContent: true,// ...}
}

disable-features

添加命令行

	//解决10.X版本跨域不成功问题(上线删除)app.commandLine.appendSwitch('disable-features', 'OutOfBlinkCors');

4️⃣ 【失败】检测fetch

fetch被魔改了

执行fetch,发现该命令如下,指向某函数,说明被魔改了。
在这里插入图片描述

正常的fetch应该如下所示:
ps: bh.fetch是小编备份的一个fetch代码,为native code
在这里插入图片描述

将fetch被赋值的地方注释掉,依然无法访问。

5️⃣ 【失败】使用axios

虽然上面修正了fetch,但是依然担心fetch有问题,于是乎,尝试用第三方库axios测试。

插入axios库

在本地任意找一份node_modules\axios\dist\browser\axios.cjs,将代码添加到目标进程的render中(如:app-bundle.js),这样我们就可以使用axios了,不过依然返回net::ERR_BLOCKED_BY_CLIENT错误。

6️⃣ 【成功】require(‘http’)

从上面的各种尝试中,我们可以看出,通过浏览器js各种失败,那么通过nodejs呢。
require加载模块,发现可以加载http模块,使用下面代码请求,终于可以请求到数据了。
不过该方案太过繁琐,继续分析吧

var http = require('http');function post(action,send,callback){var options = {hostname: '127.0.0.1',port: 16010,path: action,method: 'POST',headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'/* ,'Content-Length': send.length */}};var req = http.request(options, function (res) {// console.log('STATUS: ' + res.statusCode);  // console.log('HEADERS: ' + JSON.stringify(res.headers));  // 定义了一个post变量,用于暂存请求体的信息var body="";res.setEncoding('utf8');// 通过res的data事件监听函数,每当接受到请求体的数据,就累加到post变量中res.on('data', function (chunk) {// console.log('BODY: ' + chunk);body += chunk;});// 在res的end事件触发后,通过JSON.parse将post解析为真正的POST请求格式,然后调用传递过来的回调函数处理数据res.on('end', function(){// console.log("body = "+body);var json = JSON.parse(body);callback(json);});});req.on('error', function (e) {console.log('problem with request: ' + e.message);});req.write(send);req.end();
}
post('/posts', '{"id":3}', ()=>{})

7️⃣ 【完美解决】取消webRequest.onBeforeRequest

还是从httphttps思考,为什么唯独http无法访问,难道是electron中有代码拦截了http请求?

  • 使用其它electron应用,http可以正常访问。更加确信猜想。
  • 在electron应用的主进程代码中,搜索http关键字,找到如下代码,注释掉居然真的可以访问了。
function blockHttpRequests() {// 注释掉return;var e;i().session.fromPartition((e = g.windowOptions.webPreferences.partition) !== null &&e !== void 0? e: "").webRequest.onBeforeRequest({ urls: ["http://*/*"] }, (e, t) => {t({cancel:e.webContents && e.webContents.getURL().startsWith("file://"),});});}

🛬 文章小结

文章中的每一次尝试都有大量的知识点,每次都查了大量的文章。
electron很复杂,尤其是像本次遇到的问题,可以通过多种方式实现,所以我们需要一次次的尝试,排除错误答案,最终找到正确的解决方案。

📖 参考资料

  • MDN:CSP https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
  • nodejs 使用http模块发送post请求 https://blog.csdn.net/jiongxian1/article/details/105278651

ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/184290.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django快速指南

开始构建 Web 应用程序不仅需要对编码和设计原则有深入的了解&#xff0c;还需要对安全性和性能坚定不移的承诺。在数字化存在至关重要的时代&#xff0c;构建强大而高效的在线平台的能力是一项具有不可估量价值的技能。本教程专门面向网络工匠&#xff0c;即那些希望将技术线索…

【Git】Git 学习笔记_操作远程仓库

1. SSH 配置和克隆仓库 ssh-keygen -t rsa -C "xxxqq.com"回车后出现以下内容&#xff0c;直接回车&#xff1a; Generating public/private rsa key pair. Enter file in which to save the key (/Users/your_user_directory/.ssh/id_rsa): (按回车键) Enter pass…

干洗店洗鞋店管理系统app小程序;

干洗店洗鞋店管理系统是一款专业的洗衣店管理软件&#xff0c;集成了前台收费收银系统、会员卡管理系统和财务报表系统等强大功能。界面简洁优美&#xff0c;操作直观简单。这款系统为干洗店和洗衣店提供了成本分析、利润分析、洗衣流程管理等诸多实用功能&#xff0c;用全新的…

全方位监控基础设施,坚实守护您的业务稳定!

前言 基础设施服务是产业数字化转型建设的重要组成部分之一。当我们反复讨论如何实现高效、精确的全局监控&#xff0c;也许能从观测云借助一套方案来探索、检查和监控分布式基础架构中的每个关键部分这一操作中习得一些灵感。 在针对企业的平台中内嵌实时的基础设施监控工具…

An error occurred while filtering resources

Description Path Resource Location Type An error occurred while filtering resources PMS line 1 Maven Java EE Configuration Problem不知道怎么跑出来了&#xff0c;update project 还是不行

MS35229电机驱动器可兼容DRV8833

MS35229N/MS35229TE 是一款 12V 静音步进电机驱动芯片&#xff0c;工作电压最大可以工作到 15V&#xff0c;输出 RMS 电流1A。芯片内置 256 细分的微步进驱动技术&#xff0c;静音与低振动特性适合于各种精微控制系统。 芯片集成通用的 IC 接口以及内部指令缓存器&#xff0c;使…

linux之进程控制

进程创建&fork函数 fork函数之前就已经提到,它从已存在进程中创建一个新进程,新进程为子进程,而原进程为父进程。 调用接口&#xff1a;fork() 头文件&#xff1a;unistd.h 功能&#xff1a;创建一个子进程&#xff0c;给子进程返回0&#xff0c;父进程返回子进程pid …

C语言 指针进阶

目录 数组指针 指针数组访问数组元素 再次讨论数组名 数组指针访问一维数组&#xff08;但是这样会很别扭&#xff09; 访问二维数组元素 非数组指针访问 数组指针访问 数组传参Demo 一维数组传参 二维数组传参 指针数组指针 字符指针 函数指针 函数指针调用时可以…

秒懂!用这10款思维导图软件,让头脑风暴如虎添翼!

世界上最糟糕的感觉之一就是忘记了一个伟大的点子。原本你只需把它记下来&#xff0c;但你当时确信自己绝不会忘记如此引人入胜的事物。然而&#xff0c;当这个想法从你的脑海彻底消失时&#xff0c;分分钟会让人崩溃。 如果你的想法有很多组成部分&#xff0c;比如一个大项目…

ARMday02(汇编语法、汇编指令)

汇编语法 汇编文件中的内容 1.伪操作&#xff1a;在汇编程序中不占用存储空间&#xff0c;但是可以在程序编译时起到引导和标识作用 .text .global .glbal .if .else .endif .data .word.... 2.汇编指令&#xff1a;每一条汇编指令都用来标识一个机器码&#xff0c;让计算机做…

深度学习之基于YoloV5的火灾检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 火灾检测系统基于YoloV5的介绍 火灾检测是一项重要的安全任务&#xff0c;它旨在及时发现和报警火灾风险。基于深度…

MyBatis-plus超神用法--一文带你玩转MP

前言 MyBatis-Plus是一个基于MyBatis的增强工具&#xff0c;提供了很多便捷的功能和增强的功能&#xff0c;以下是一些MyBatis-Plus的超神用法&#xff1a; 通用Mapper&#xff1a;MyBatis-Plus提供了通用Mapper的功能&#xff0c;可以通过继承BaseMapper接口&#xff0c;实现…

Gradle笔记 四 Gradle的核心 TASK

文章目录 Task任务入门任务的行为任务的依赖方式任务执行常见的任务&#xff08;*&#xff09;项目报告相关任务调试相关选项性能选项守护进程选项日志选项其它(*) 任务定义方式任务类型任务的执行顺序动态分配任务任务的关闭与开启任务的超时任务的查找任务的规则任务的 onlyI…

【RabbitMQ】常用消息模型详解

文章目录 AMQP协议的回顾RabbitMQ支持的消息模型第一种模型(直连)开发生产者开发消费者生产者、消费者开发优化API参数细节 第二种模型(work quene)开发生产者开发消费者消息自动确认机制 第三种模型(fanout)开发生产者开发消费者 第四种模型(Routing)开发生产者开发消费者 第五…

3.2-Docker Image概述

常用docker命令&#xff1a; 查看docker image有哪些 docker image ls Image的获取方式

docker 安装 minio (单体架构)

文字归档&#xff1a;https://www.yuque.com/u27599042/coding_star/qcsmgom7basm6y64 查询 minio 镜像 docker search minio拉取镜像 docker pull minio/minio创建启动 minio 容器 用户名长度至少为 3&#xff0c;密码长度至少为 8 docker run \ -p 9000:9000 \ -p 9090:909…

51单片机-中断

文章目录 前言 前言 #include <reg52.h> #include <intrins.h>sbit key_s2P3^0; sbit flagP3^7;void delay(unsigned int z){unsigned int x,y;for(xz;x>0;x--)for(y114;y>0;y--); }void int_init(){EA1;EX11;IT11;}void main(){int_init();while(1){if (key…

zabbix监控安装-linux

zabbix6.4中文文档1. 简介 (zabbix.com) Zabbix 是一个企业级的开源分布式监控解决方案。 1.zabbix结构体系 Server&#xff1a; server 是存储所有配置、统计和操作数据的中央存储库。 Proxy&#xff1a; zabbix proxy可以代替 Zabbix server 收集性能和可用性数据。p…

引用类型;强引用;软引用;弱引用和虚引用

概述 平时在编写代码的时候内存都是由jvm管理&#xff0c;对象的回收也是jvm在管理&#xff1b; 但是有些时候jvm无法回收对象&#xff0c;最后就会抛出oom异常. 那么那些回收不了的对象肯定有区别于能回收的对象&#xff1b; 先上一波引用类型介绍 强引用 比如平常我们直…

【pyspider】爬取ajax请求数据(post),如何处理python2字典的unicode编码字段?

情景&#xff1a;传统的爬虫只需要设置fetch_typejs即可&#xff0c;因为可以获取到整个页面。但是现在ajax应用越来越广泛&#xff0c;所以有的网页不能用此种爬虫类型来获取页面的数据&#xff0c;只能用slef.crawl()来发起http请求来抓取数据。 直接上例子&#xff1a; 可以…