gpt4 book ai didi

node.js - Node.js 是否会增加跨连接共享数据的风险?

转载 作者:太空宇宙 更新时间:2023-11-03 23:09:05 26 4
gpt4 key购买 nike

由于 Node.js 是单线程的,并且许多请求使用异步回调或事件并行运行,并且任何一个请求都不会立即运行完成,因此是否存在来自一个 http 请求的进程最终与其他请求共享变量的风险请求,特别是在函数/模块内的临时对象或变量中存储数据时?

例如,在 php 中,每个进程都有自己的线程并运行直至完成(阻止其他任何事情)。因此,无法跨连接/请求访问变量。

我尝试用谷歌搜索但没有找到太多。这还值得担心吗?来自不同(甚至相同)用户的各个请求之间是否可能无意间共享变量?

最佳答案

只有一种情况可能会引起问题:无意的全局变量。

考虑以下 Express 路线:

app.post('/foo', function(req, res) {
var user = req.cookies.user;
token = generateToken(user);

someAsyncOperation(user, req.body, function(err, result) {
saveUser(token, result);
res.send(result);
});
});

你看到错误了吗? user 的作用域为函数,但 token 是一个隐式全局变量,将在所有请求之间共享。

在此示例中,假设的作者可能打算在 user 定义后使用逗号而不是分号(这将导致 token 被正确限定范围) 。不幸的是,他的手指向东北方向下降了一厘米,造成了一个很容易被忽视的错误。

  • 请求 A 进来。用户从 cookie 加载,某种 token 生成函数创建一个对于用户来说应该是唯一的 token 。
  • 异步操作已排队,回调函数绑定(bind)到请求 A 的范围。
  • 异步操作需要一些时间,因此 Node 会空闲。
  • 请求 B 进来。它在其范围内初始化一个新的用户
  • 全局 token 被请求B的 token 覆盖
  • 另一个异步操作已在 B 中排队; Node 再次空闲。
  • A 的异步操作完成。
  • 呃哦。 A 的操作结果使用 B 的 token 保存,因为这是 token 最后设置的内容。
  • B 的异步操作完成并将更多数据保存到 B 的 token 中。

在这种情况下,A 中没有保存任何内容,而 B 中保存了两组数据。这可能会导致各种问题,从几乎不可能重现和调试的奇怪不一致,一直到实际的财务损失。 (我是不是不小心给B发了两个订单?)

好消息是很容易避免这个问题。使用strict mode 。严格模式使得对隐式全局变量的赋值成为 ReferenceError 等。只需添加到 js 文件的顶部即可:

'use strict';

或者使用参数运行 Node :

--use_strict

启用严格模式后,您不会意外使用隐式全局变量,因此这不再是问题。局部变量和 req/res 对象是安全的;您可能遇到麻烦的唯一其他领域是当您有意使用某种共享状态时,但在任何其他语言中,危险都是相同的。

关于node.js - Node.js 是否会增加跨连接共享数据的风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22870727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com