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]);
}
但是,四处发送凭据让我在安全方面感到不安。
- 可以拦截“worker.postMessage()”吗?
- 如果我以后想切换到共享工作者(我有一个“最好有”的用例),这会影响安全吗?
对这个话题有什么想法吗?
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.json
或 XMLHttpRequest.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 中直接读取恶意脚本并从中获取敏感信息,但再一次,如果他们能做到......他们当然可以通过更简单的方式访问该令牌。
我想在用户登录后使用专用网络工作者(而非共享工作者)在后台从 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]);
}
但是,四处发送凭据让我在安全方面感到不安。
- 可以拦截“worker.postMessage()”吗?
- 如果我以后想切换到共享工作者(我有一个“最好有”的用例),这会影响安全吗?
对这个话题有什么想法吗?
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.json
或 XMLHttpRequest.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 中直接读取恶意脚本并从中获取敏感信息,但再一次,如果他们能做到......他们当然可以通过更简单的方式访问该令牌。