如何将 CSP 限制为 chrome 中的 file:/// url?

How to CSP restrict to file:/// urls in chrome?

我在 Web 视图中有一个 iframe,它使用以下命令从 android 应用程序的资产加载脚本 :-

<script src='file:///android_asset/trusted-iframe-script.js'></script>

现在我想在 iframe 上设置内容安全策略,这样就无法加载其他脚本。 为此,我将以下内容添加到 iframe CSP

script-src: 'file:///android_asset/trusted-iframe-script.js';

这不起作用,因为文件 uri 被 chrome 忽略了。

The source list for Content Security Policy directive 'script-src' contains an invalid source: 'file:///android_asset/trusted-iframe-script.js'. It will be ignored.
Refused to load the script 'file:///android_asset/trusted-iframe-script.js' because it violates the following Content Security Policy directive: "script-src file:///android_asset/trusted-iframe-script.js".

我阅读了有关文件系统 uri 的信息,但这需要请求访问用户,但实际上我只需要访问我自己的资产而不是一般的文件系统。我还阅读了有关 blob: urls 的内容,但这感觉类似于内联整个脚本

将 csp 限制为仅文件 url 的正确方法是什么?

CSP URI 没有引号 - 所以尝试 script-src: file:///android_asset/trusted-iframe-script.js;

如果这不起作用,大多数 Android 浏览器现在支持 CSP2,它允许您为受支持的脚本指定哈希值。

如果 CSP 设置在包含 iframe 的 "page" 上,您应该使用 child-src: 指令而不是 script-src: (Source)

那么,我不会使用如何包含断言文件,您可以尝试使用:

  • child-src: file:///android_asset/trusted-iframe-script.js

    // 无法测试

  • child-src: filesystem:///android_asset/trusted-iframe-script.js

    // source 并检查是否仍然需要请求访问用户

  • 子源:https://your.trusted.website.com/trusted-iframe-script.js

    // 这应该可行,但它需要有一个受信任的服务器并且应用程序必须连接到网络(没有明显的条件)

简而言之,沙盒 iframe 无法做到这一点。

Chrome CSP 不允许将文件 urls 作为脚本 src 列入白名单。您可以使用指令文件:(没有任何 url),如果 iframe 未被沙盒化,这将起作用。但这是个坏主意,因为

一个。我的 iframe 是沙盒化的,

乙。这是一个未记录的关键字,可能随时停止工作。

我还尝试为内容创建一个 blob url,然后将其传递给 iframe,但这也不起作用,除非您在 iframe 沙盒属性上设置 allow-same-origin。