【发布时间】:2019-09-25 12:14:53
【问题描述】:
最近我在 a library 工作,它支持使用工人进行一些繁重的工作。
我发现,至少在大多数在线代码编辑器 (sn-ps/jsfiddle/codepen/glitch) 上,我似乎无法从另一个域加载工作程序。我收到一个安全错误(或 Firefox 静默失败)
function startWorker(url) {
try {
const worker = new Worker(url);
console.log('started worker');
worker.onmessage = e => log('black', e.data);
worker.postMessage('Hi from page');
} catch (e) {
console.error('could not start worker:', e);
}
}
const workerURL = 'https://greggman.github.io/doodles/test/ping-worker.js';
startWorker(workerURL);
在 Chrome 和 Safari 中我得到了
SecurityError: 无法构造“Worker”:无法从源“https://...”访问“https://greggman.github.io/doodles/test/ping-worker.js”处的脚本。
问题 #1:为什么会出现该错误?
什么设置导致它? iframe 选项?页面的http标头? iframe 的 http 标头?脚本中的 http 标头?)
问题 #2:有没有办法在 Firefox 中检测到这个问题?
我可以从工作人员那里发送消息并超时,但我想知道是否有一些不那么间接的方法来检查成功/失败
无论如何,我都可以通过自己获取脚本文本来解决这个问题
function startWorker(url) {
try {
const worker = new Worker(url);
console.log('started worker');
worker.onmessage = e => console.log(e.data);
worker.postMessage('Hi from page');
} catch (e) {
console.error('could not start worker:', e);
}
}
async function main() {
const workerURL = 'https://greggman.github.io/doodles/test/ping-worker.js';
const res = await fetch(workerURL);
const text = await res.text();
const blob = new Blob([text], {type: 'application/javascript'});
const url = URL.createObjectURL(blob);
startWorker(url);
}
main();
我询问了浏览器团队,并被告知手动获取并制作 blob url 是可以的,这导致了我的主要问题。
问题 #3:鉴于解决方法很简单,这个安全错误的意义何在?
鉴于有解决方法,在什么情况下没有解决方法?安全错误的意义何在?浏览器供应商说我的解决方法很好,实际上我已经使用了 7-8 年的能力来启动东西作为 blob url。 (html,脚本,但直到现在还不是工作人员)但是如果我的解决方法很好,那么错误的意义何在?
【问题讨论】:
-
同源策略和CORS
-
你是说要求一个工人不要求 CORS 但 fetch 呢?
-
阅读developer.mozilla.org/en-US/docs/Web/API/Worker/Worker 你所问的就在顶部的文档中,还有黄色框。
-
链接有文本 "注意:浏览器制造商对于数据 URI 是否同源存在分歧。虽然 Gecko 10.0 (Firefox 10.0 / Thunderbird 10.0 / SeaMonkey 2.7) 及更高版本接受数据 URI,在所有其他浏览器中并非如此。"
-
或者只是将文件移动到您的域并完成它,而不是冒着有人更改文件做坏事甚至删除它的风险。
标签: javascript html security web-worker