JS Web 工作者和安全

JS Web workers and security

我想在用户登录后使用专用网络工作者(而非共享工作者)在后台从 S3 加载文件。要访问 s3 文件,我需要对用户 (AWS Cognito) 进行身份验证。

在创建经过身份验证的 s3 对象后,我尝试像这样从浏览器的 js 调用网络工作者。

    async function softSyncPlaground(oFoldersInSync, localS3Object){
        var worker = new Worker('js/worker_syncPlayground.js');
         worker.addEventListener('message', function(e) {
            console.log('Worker said: ', e.data);
        }, false);
        worker.postMessage([oFoldersInSync, localS3Object]);
    } 

但它不会工作,因为不能将具有函数的对象提交给网络工作者。

所以我的后备方案是 post 将凭据输入网络工作者并在那里生成经过身份验证的 s3 对象。

    async function softSyncPlaground(oFoldersInSync, sIdentityPoolId, oLogins){
        var worker = new Worker('js/worker_syncPlayground.js');
         worker.addEventListener('message', function(e) {
            console.log('Worker said: ', e.data);
        }, false);
        worker.postMessage([oFoldersInSync, sIdentityPoolId, oLogins]);
    }

但是,四处发送凭据让我在安全方面感到不安。

对这个话题有什么想法吗?

Can "worker.postMessage()" be intercepted?

是的,就像 JS 中的几乎所有内容一样, 仅来自客户端本身。

例如,可以简单地覆盖 Worker 原型的方法,您的实例就会受到影响:

const worker = new Worker( "data:text/javascript," );
worker.postMessage( "my-super-secret-password" );
<script id="evil-script">
Worker.prototype.postMessage = (...args) => {
  console.log("caught", ...args);
};
</script>

但是如果恶意脚本能够做到那个,它也能够覆盖您最初用于获取该密码的方法(例如Response.prototype.jsonXMLHttpRequest.prototype.response).
所以这里没有“增加”的风险。

If I want switch to a shared worker, later on (I've a "nice to have" use case for this), would this affect security?

如果你自己不让它变得更危险,就不会。

SharedWorker (SW) 的“客户端”只能向 SW 发送 MessagePort,他们无法访问其全局范围,也无法从中读取任何内容。
因此,只要您不 postMessage() 自己从 SW 向客户端发送敏感信息,您就是安全的。请注意,由于 Worker 只能从同源创建,所有客户端实际上都可以读取其源代码,但无论如何敏感信息不应在 JS 源代码中进行硬编码。

[gathered from the comments]
I was worried, as an HTTP Call or a WebSocket would be easier to eavesdrop.

这里不用担心,MessagePort 接口是 100% 客户端。再一次,是的,受感染的机器可能会在其 RAM 中直接读取恶意脚本并从中获取敏感信息,但再一次,如果他们能做到......他们当然可以通过更简单的方式访问该令牌。