Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
OldKing-lion opened this issue Oct 30, 2023 · 25 comments

Comments

@OldKing-lion
Copy link

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
Copy link
Author

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

@github-actions
Copy link

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
Copy link
Author

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
Copy link
Member

kuitos commented Oct 30, 2023

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

@OldKing-lion
Copy link
Author

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

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

@OldKing-lion
Copy link
Author

@kuitos 帮忙看下

@kuitos
Copy link
Member

kuitos commented Oct 31, 2023

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

@OldKing-lion
Copy link
Author

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

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

@kuitos
Copy link
Member

kuitos commented Oct 31, 2023

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

@OldKing-lion
Copy link
Author

OldKing-lion commented Oct 31, 2023

知道为什么了,问题在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
Copy link
Author

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

@OldKing-lion
Copy link
Author

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

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

@bravepg
Copy link
Contributor

bravepg commented Oct 31, 2023

_getExternalScripts

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

@OldKing-lion
Copy link
Author

_getExternalScripts

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

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

@bravepg
Copy link
Contributor

bravepg commented Oct 31, 2023

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

@OldKing-lion
Copy link
Author

OldKing-lion commented Oct 31, 2023

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

@OldKing-lion
Copy link
Author

OldKing-lion commented Oct 31, 2023

_getExternalScripts

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

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

@bravepg
Copy link
Contributor

bravepg commented Oct 31, 2023

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

@OldKing-lion
Copy link
Author

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

@OldKing-lion
Copy link
Author

image

@bravepg
Copy link
Contributor

bravepg commented Oct 31, 2023

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

@OldKing-lion
Copy link
Author

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

@OldKing-lion
Copy link
Author

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

@OldKing-lion
Copy link
Author

最终去掉了注入,解决

@ken1987
Copy link

ken1987 commented Dec 27, 2023

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants