会话密钥在 Express Web 框架中的重要性

2022-08-30 14:34:54

我对会话秘密的重要性感到非常困惑。我正在使用Express和Node进行Web开发,目前,我正在尝试实现一个简单的登录。以下代码取自 Express 中的会话示例。

// Required by session() middleware
// pass the secret for signed cookies
// (required by session())
app.use(express.cookieParser('keyboard cat'));

// Populates req.session
app.use(express.session());

它使用“键盘猫”作为会话机密。我四处寻找的关于会话机密的许多内容都建议我将其更改为自定义内容。我现在有3个关于这个问题的具体问题。

  1. 为什么我以前在使用PHP时没有看到过这个?
  2. 会话密钥究竟用于什么目的?
  3. 假设我更改了会话密钥。我的代码是开源的。在这种情况下,更改这一点是不是有点多余?我没有看到要求用户提供自定义密钥作为选项。
  4. 我正在考虑生成一个随机的UUID来填写密钥。这有问题吗?(在安全性方面)

答案 1
  1. 因为PHP不是Nodejs。PHP中的会话管理与node中的会话管理不同:node永远不会死,不像PHP,它不断被你的服务器守护进程(apache,IIS,你有什么)调用,要求生成一些内容,然后结束它的进程。Node相当于ApachePHP。
  2. 它用于加密会话cookie,以便您可以合理地(但不是100%)确定cookie不是假的,并且连接应被视为与express的较大会话的一部分。
  3. 这就是您不将字符串放在源代码中的原因。您可以将其设置为环境变量并将其读入process.env(“SESSION_SECRET”),或者使用带有 https://npmjs.org/package/dotenv 的文件,并确保这些文件永远不会触及您的存储库(svn/git排除/忽略),以便您的秘密数据保持机密。.env
  4. 在节点应用运行时,密钥是不可变的。想出一个长而有趣的句子比UUID要好得多,UUID通常比."I didn't think I needed a secret, but some rando on Stackoverflow told me Express needed one so here we are"

我如何使用会话:

.env文件(总是在我的.gitignore文件中,所以它永远不会命中我的公共存储库):

SECRET="This is my funky secret oh my god it has ninja turtles"

应用程序.js:

var express = require('express'),
    env = (function(){
      var Habitat = require("habitat");
      Habitat.load();
      return new Habitat();
    }()),
    app = express();

app.use(express.compress()); // gzip all the things. If possible.
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.cookieSession({
  key: "mysite.sid",
  // seeing this tells you nothing about the actual secret:
  secret: env.get("SESSION_SECRET"),
  cookie: {
    maxAge: 2678400000 // 31 days
  }
}));
app.use(express.csrf());

该CSRF位可确保页面请求来自您自己的网站,而不是cURL请求或嵌入其他人的网站。http://expressjs.com/api.html#csrf 以获取更多信息。


答案 2

我认为其他答案中遗漏了要点,即参数是否使会话管理更安全。在这个Security.StackExchange问题中很好地讨论了这个问题:为什么直接将会话ID存储在cookie中是不安全的?secret

我建议阅读它(不仅投票率最高的答案是相关的)。

试图总结一下:如果会话ID是大随机数,它不会明显减少会话被猜测和劫持的机会,但如果会话ID是自定义的,就像递增ID一样,这显然会有很大的帮助,这在ExpressJS中是可能的。

用户可以使用他们想要的任何会话 ID。也许有人觉得他们应该使用SQL数据库中的自动递增数字,这并不重要,因为我们通过对值进行签名来保护他们的不知情决定,拉长密钥。


推荐