有没有办法在 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 访问?的主要内容,如果未能解决你的问题,请参考以下文章