因此 SharedArrayBuffer 最近限制为跨源隔离页面作为安全修复。
我们有一个依赖于 SharedArrayBuffer 的工具,我对它进行了重新设计,将其移动到剥离了所有其他站点 UI 和其他内容的准系统页面,并发送以下标头:
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
尝试将其加载到成熟网站的 iframe 中会出现控制台错误
SharedArrayBuffer will require cross-origin isolation as of M92
,然后是
ReferenceError: SharedArrayBuffer is not defined
- 与我在跨原点隔离最小页面本身上的工具之前得到的结果相同。我尝试包含 iframe 的页面是 not跨域隔离的。这样做即使不是不可能,也是非常困难的。我根本不需要从父页面与 iframe 进行交互,这只是一个方便/风格的事情。目前生产上的解决方案只是将用户链接到新窗口中的最小跨源工具页面,但这非常尴尬。 我希望的是 iframe
sandbox 属性的某种组合或其他东西可以使这项工作起作用?我为此奋斗了几个小时。 据我所知,这可能不可行。
allow-scripts
属性中添加
allow-same-origin
和 sandbox
标记:<iframe src="…" sandbox="allow-scripts allow-same-origin"></iframe>
^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^
以下是有关该主题的一些相关资源:
<iframe>
:内联框架元素(MDN 文档), – 不要错过属性描述中有关安全性的注意。
SharedArrayBuffer
问题没有帮助,那么事情会有点复杂。
正确的跨域需要来自子资源的显式标头(<iframe>
必须发送标头),当子资源是第三方且失控时,这是一个大问题。为了缓解这个问题,有一个
提案
Cross-Origin-Embedder-Policy: credentialles
。但是,有一个问题:它不会改变
<iframe>
的工作方式
(真糟糕,这正是我们所需要的!)。有一个关于匿名 iframe 的讨论可以解决这个问题,但它还没有解决,所以我不会在这里屏住呼吸。因此,剩下的唯一选择是延迟 Chrome 行为中的此更改请求您的来源的令牌
。我不确定此选项是否适合您的情况,但也许它可以帮助您找到完整的解决方案。 这篇blogpost
self.addEventListener("install", function() {
self.skipWaiting();
});
self.addEventListener("activate", (event) => {
event.waitUntil(self.clients.claim());
});
self.addEventListener("fetch", function(event) {
if (event.request.cache === "only-if-cached" && event.request.mode !== "same-origin") {
return;
}
event.respondWith(
fetch(event.request)
.then(function(response) {
// It seems like we only need to set the headers for index.html
// If you want to be on the safe side, comment this out
// if (!response.url.includes("index.html")) return response;
const newHeaders = new Headers(response.headers);
newHeaders.set("Cross-Origin-Embedder-Policy", "require-corp");
newHeaders.set("Cross-Origin-Opener-Policy", "same-origin");
const moddedResponse = new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders,
});
return moddedResponse;
})
.catch(function(e) {
console.error(e);
})
);
});
答案迟了,但是对于任何寻求解决方案的人来说。
Cross-Origin-Embedder-Policy: credentialless
代替:
Cross-Origin-Embedder-Policy: require-corp