umijs / qiankun

📦 🚀 Blazing fast, simple and complete solution for micro frontends.
https://qiankun.umijs.org
MIT License
15.8k stars 2.01k forks source link

[Feature Request] waf 会自动注入一个js,但是乾坤加载的时候报错 #2769

Closed OldKing-lion closed 11 months ago

OldKing-lion commented 11 months ago

Background

目前项目使用的是angular&vue&qiankun,最近线上测试的时候发现页面上打印了一个错误,导致页面无法正确加载ctrl+f5后正常。在我调试代码的时候发现,是_Incapsula_Resource?SWJIYLWA=719d34d31c8e3a6e6fffd425f7e032f3&ns=7&cb=414815996这个东西引起的。请问有办法解决吗,我们是云服务,也没办法不使用这个。

Proposal

希望处理一下代码,在JZ这个方法里判断一下,如果不是字符串,应该e.src.startsWith image

Additional context

Add any other context or screenshots about the feature request here.

OldKing-lion commented 11 months ago

当我服务器开启waf的时候,会自动生成一个注入的脚本,类似/_Incapsula_Resource?SWJIYLWA=719d34d31c8e3a6e6fffd425f7e032f3&ns=7&cb=414815996,这个时候qiankun js加载的时候会报个错误,e.startsWith is not a function 好像是和上面那个脚本有关系,ctr+f5后正常,请问怎么解决这个问题

github-actions[bot] commented 11 months ago

Hello @OldKing-lion. In order to facilitate location and troubleshooting, we need you to provide a realistic example. Please forking these link codesandbox or clone qiankun examples to your GitHub repository.

你好 @OldKing-lion, 为了方便定位和排查问题,我们需要你提供一个重现实例,请提供一个尽可能精简的链接 codesandbox 或直接 clone qiankun examples,并上传到你的 GitHub 仓库。

OldKing-lion commented 11 months ago

Hello @OldKing-lion. In order to facilitate location and troubleshooting, we need you to provide a realistic example. Please forking these link codesandbox or clone qiankun examples to your GitHub repository.

你好 @OldKing-lion, 为了方便定位和排查问题,我们需要你提供一个重现实例,请提供一个尽可能精简的链接 codesandbox 或直接 clone qiankun examples,并上传到你的 GitHub 仓库。

68747470733a2f2f67772e616c697061796f626a656374732e636f6d2f7a6f732f616e7466696e63646e2f79396b776737445643642f726570726f647563652e676966

提供不了。因为只有开启了waf的服务器才会有这个问题。开发环境和不开启WAF的环境是没有这个问题的。不过你可以看下我最开始发的那张图,那是我断点定位到的代码。

kuitos commented 11 months ago

只有一个截图没办法判断是什么原因导致的,可以本地起个 node 模拟一下 waf 的行为

OldKing-lion commented 11 months ago

只有一个截图没办法判断是什么原因导致的,可以本地起个 node 模拟一下 waf 的行为

image 我发现我这个js是标记了async的,为什么没有被正确处理? image 我使用的版本: image

OldKing-lion commented 11 months ago

@kuitos 帮忙看下

kuitos commented 11 months ago

确保都装的最新版本,只有截图没有复现的话只能靠猜了😑

OldKing-lion commented 11 months ago

确保都装的最新版本,只有截图没有复现的话只能靠猜了😑

最新版也不行。在加载子应用的时候就报错. excludeAssetFilter都没执行. 看了import-html-entry的代码,也确实有判断async标记的脚本。我现在在想怎么不让waf插入的脚本应该qiankun的加载

kuitos commented 11 months ago

qiankun 跟 import-html-entry 实际安装的什么版本,发出来看看

OldKing-lion commented 11 months ago

知道为什么了,问题在import-html-entry这个包里。 首先是_getExternalScripts方法:这个方法的return里,判断scripts里的元素是不是string,是string,返回string,不是string,组装对象返回,代码如下:

image 然后在调用的时候,用到getExecutableScript方法,该方法里有个判断是不是内联脚本的isInlineCode方法:如下图,如果_getExternalScripts返回的内容是对象,isInlineCode方法的参数也是对象,那code.startsWith肯定会报错,因为startsWith是string对象的方法。

image image

大佬@kuitos 您看下我分析的是否有问题,如果没有问题,您能否打个patch?

OldKing-lion commented 11 months ago

我是没有复现,因为我比较菜,你们的examples我没跑起来,我也不会用nodejs模仿waf的行为。但是我经过调试和翻阅import-html-entry的包,发现了这个问题。你们可以验证一下。这个解决了,也是对框架的一个完善。 image

OldKing-lion commented 11 months ago

qiankun 跟 import-html-entry 实际安装的什么版本,发出来看看

现在qiankun是v2.10.14 import-html-entry是v1.15.1

bravepg commented 11 months ago

_getExternalScripts

这里应该不是根因,这个只是 async 标识,后面对 async 标识会有不同的处理 image

OldKing-lion commented 11 months ago

_getExternalScripts

这里应该不是根因,这个只是 async 标识,后面对 async 标识会有不同的处理 image

我调试了线上的代码,抛出异常的地方就是isInlineCode方法

bravepg commented 11 months ago

或者你可以把调用栈给截图放出来...

OldKing-lion commented 11 months ago

调试代码执行顺序:@bravepg 1 2 3 4

OldKing-lion commented 11 months ago

_getExternalScripts

这里应该不是根因,这个只是 async 标识,后面对 async 标识会有不同的处理 image

你这段代码我有看到,但是是在getExecutableScript这个方法后面,还没执行你发的截图这里就报错了

bravepg commented 11 months ago

image 你这个都是作用域变量,不是调用栈。截这个 image

OldKing-lion commented 11 months ago

image image image image 我其实前面特意截的变量,堆栈信息不太清楚吧

OldKing-lion commented 11 months ago

image

bravepg commented 11 months ago

你能看下你的 entry 是个啥么? image

OldKing-lion commented 11 months ago

你能看下你的 entry 是个啥么? image 我代码里的entry是 https://domain/subdomain/index.html 断点调试,这里我晚点看下

OldKing-lion commented 11 months ago

因为waf生成的这个东西不是一直都有,如果我浏览器ctrl+f5就没了,也就不会报错了。所以现在我看不到错误了,晚点我要更新一下,更新后第一次加载,就会有这个错误

OldKing-lion commented 11 months ago

最终去掉了注入,解决

ken1987 commented 9 months ago

我也遇到这个问题,是因为 vue-cli 配置了 crossorigin: 'use-credentials',去掉就正常了