有没有办法在 Android Webview(使用 CSP)上为 WebWorker 启用 fileuri 访问?

Posted

技术标签:

【中文标题】有没有办法在 Android Webview(使用 CSP)上为 WebWorker 启用 fileuri 访问?【英文标题】:Is there a way to enable fileuri access for WebWorker on Android Webview (with CSP)? 【发布时间】:2020-01-15 23:59:30 【问题描述】:

我在 Firefox/Chrome/android Webview 上有一个现有的开源消息传递 Web 应用程序,该应用程序已被最近的 CSP 3 安全更改破坏。

在 Firefox/Chrome 上可以通过将 about:config security.fileuri.strict_origin_policy 从默认值调整为 false 来避免这种情况。但是,我刚刚注意到 Android 9 Webview 显然强制执行相同的行为,使 Android 应用程序无用,因为它无法加载 Webworker 网络部分。

应用程序分为 UI 和 Webworker 部分,Webworker 处理网络流量。所有文件都是本地 js 文件,新的 Webworker 由主 UI 加载,具有相对文件路径。它使用“importScripts”加载其他脚本。一切运行良好,设计易于维护,最棒的是应用程序完全是本地的,无需通过网络加载任何内容(当然实际消息除外)。

不过,随着最近的浏览器版本更新,出现了问题。显然,新的 CSP 安全事物强制默认情况下不允许加载本地 Webworker 脚本。

我尝试启用不同的 CSP3 webworker-src 选项但没有成功。现在恐怕没有可用的了。

使用带有 CSP 的 Webworker 允许对脚本进行相对文件访问就足够了。

现在看起来像这样:

<meta http-equiv="Content-Security-Policy" content="default-src * 'unsafe-inline'; style-src * 'unsafe-inline'; media-src *; img-src 'self' data:; connect-src ws://*;" />

Webworker 是这样加载的:

var webWorker = new Worker('mles-webworker/js/webworker.js');

它会在内部加载以下脚本:

importScripts('cbor.js');

问题显然与中描述的基本相同 Chrome can't load web worker 除了现在已经扩展到 Android Webview。

也许有一个我无法弄清楚的 CSP?允许在相对于主文件的位置本地打开文件的东西。

我可能只是移动 Webworker 以从服务器加载,但这不是一个真正的解决方案,因为它实际上是不可维护的。还有什么我可以尝试的吗?谢谢!

【问题讨论】:

【参考方案1】:

最终问题不在 CSP 中。如果 WebSocket 连接在没有 TLS 的情况下运行,Android 9 或更高版本需要特定的 android:usesCleartextTraffic="true" 设置。

此外,可以通过 Android WebView WebSettings 启用 fileuri 访问。默认情况下由 Cordova 完成。

【讨论】:

这是您唯一需要更改的设置吗?我的config.xml 中已经有了该设置,但我仍然看到问题所在。另外,您使用的是什么 webview 插件和版本?我正在使用ionic webview plugin,我注意到当我使用版本 2.5.1 时,我没有任何与工作人员有关的 CSP 问题。当我迁移到 4.x 时,问题就开始了。

以上是关于有没有办法在 Android Webview(使用 CSP)上为 WebWorker 启用 fileuri 访问?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Android Webview(使用 CSP)上为 WebWorker 启用 fileuri 访问?

有没有办法预先缓存网页以使用 Android WebView 查看?

有没有办法知道一个h5页面是不是在android平台上加载了webview?

有没有办法在android上有一个webview,我可以在页面加载之前注入css?

Xamarin.Forms - 如果 webView 包含在 Android 上打开的模式或菜单,有没有办法禁用拉刷新?

Android WebView:有没有办法获取 javascript 堆栈跟踪?