首页 > 其他分享 >MaXHR设计和实现

MaXHR设计和实现

时间:2023-05-15 16:44:08浏览次数:34  
标签:劫持 XMLHttpRequest 请求 实现 JS xhr MaXHR 设计 重写

miniAppXMLHttpRequest实现
一个用于重写JS xhr请求底层的工具
为什么要重写JS 请求
明确需求
首先明确需要写的功能:非侵入式的劫持项目所有请求。
明确概念
有哪些请求类型呢?
淘汰的表单同步提交请求暂不考虑
明确JS异步请求的API:XMLHttpRequest、fetch
纠正jq axios时期的概念错误:ajax不是一个具体方法,是Asynchronous Javascript And XML(异步JavaScript和XML),即异步请求,是设计思想
原生xhr和fetch都是基于XMLHttpRequest对象的提供API,fetch是更进一步提供了 Promise链式风格的API方便使用
非侵入式
什么是侵入式?
侵入式,就是我写了代码和使用规范,第三方项目必须引用和按照我的使用规范来实现功能
如何非侵入式引用?
没想太复杂,项目引入一个库实现功能是最低需求,由于我们阶段需求是小程序在原生客户端的实现,所以引用可以分为两类:主动和非主动
非主动引入,典型的项目案例就是油猴脚本,一种浏览器插件,可以用更高的权限侧载JS代码到当前网页,那么小程序也可以参考这种非第三方项目主动引入的方式
主动引入,script文件方式引用,和编码时improt、require方式引用
这两种方式由于使用方式过于简单,所以被认为非侵入式引用
劫持
如何劫持所有请求?
对于一个已知项目,劫持所有请求,只需要把请求的代码封装一个入口,统一调用;对于未知的项目,他们的共通点唯一的就是使用了原生JS的XMLHttpRequest对象,即一个中心,fetch有点特殊,用XMLHttpRequest实现但是提供了原生的API,所以在XMLHttpRequest对象上想办法劫持是一个突破点。
扩展Tips:以上说的都是web2.0,web3.0时代,跨中心的网络请求软层面已经逐渐在发展和形成规范,硬层面量子通信的纠缠现象和应用证明跨中心的现实存在。在这个过程中,利用现实存在进行逆向工程,形成了很多高效的手段。
逆向分析
劫持是需求,逆向分析是软件工业方法,那么在明确一个中心XMLHttpRequest后,对XMLHttpRequest进行逆向,有哪些办法可以用?
首先设置逆向环境和作用域:webview环境和window.XMLHttpRequest对象作用域
JS逆向方法,首先想到了hook钩子,有其他方法但时间人力有限,先主攻一个方向
hook
概述
Hook是一种钩子技术,在系统没有调用函数之前,钩子程序就先得到控制权,这时候钩子函数既可以加工处理该函数的执行行为,也可以强制结束消息的传递,简单来说就是修改原有的js代码就是hook
方法尝试
直接替换xhr的方法和属性
尝试写demo和查阅资料得出结论:xhr的关键属性 readyState、status、statusText、response、responseText、responseXML 是 readonly不可修改,简单替换不可取,那就只能重写了
勾入原xhr的方法和属性,取得控制权
限制很窄很明确,只能使用proxy、Object.defineProperty两种方式,最典型的参考案例就是vue2到vue3,发展到看proxy方式更新更合理,但是调研和自研的成本比较高。
尝试写demo后发现完美接管控制权,但是关键属性不可修改,无奈先暂停深入
结论
综上:目前只有重写XHR这条路技术理论上是通的。首先明确,xhr对象的属性和方法并不多,但是调试兼容性并总结规范会花费很长时间,暂定6个小时突破尝试。
重写XHR
写完再补全代码实现过程文档。。。
目标
覆盖原生XHR对象 成功
重写原生XHR属性和方法 成功
请求发送hook发送前、发送后、并apply(this) 成功
小程序基础库集成 未开始做
未实现和缺点
fetch劫持还未实现
长链接还未实现
底层绕过了浏览器,文件流式传输兼容性问题还未测试和实现

标签:劫持,XMLHttpRequest,请求,实现,JS,xhr,MaXHR,设计,重写
From: https://www.cnblogs.com/yalejian/p/17402370.html

相关文章