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

glu*_*xon 22 php session node.js express

我对会话秘密的重要性感到困惑.我正在使用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());
Run Code Online (Sandbox Code Playgroud)

它使用"键盘猫"作为会话秘密.关于会话秘密我看过的许多事情都建议我把它改成自定义的东西.我现在有3个具体问题.

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

Mik*_*ans 37

  1. 因为PHP不是Nodejs.PHP中的会话管理与节点中的会话管理不同:节点永远不会死,不像PHP,它经常被服务器守护程序(apache,IIS,你有什么)调用,要求生成一些内容,然后结束它的进程.Node相当于Apache PHP.
  2. 它用于加密会话cookie,以便您可以合理地(但不是100%)确定cookie不是假的,并且连接应该被视为具有express的较大会话的一部分.
  3. 这就是您不将字符串放在源代码中的原因.你把它变成一个环境变量并以process.env("SESSION_SECRET")的形式读取它,或者你使用https://npmjs.org/package/habitat.env文件,并确保这些文件永远不会触及你的存储库(svn/git)排除/忽略)以便您的秘密数据保密.
  4. 您的节点应用程序运行时,秘密是不可变的.与UUID相比,提出一个长而有趣的句子要好得多,UUID通常比UUID短得多"I didn't think I needed a secret, but the voices in my head told me Express needed one".

我如何使用会话:

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

SECRET="This is my funky secret oh my god it has ninja turtles"
Run Code Online (Sandbox Code Playgroud)

app.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());
Run Code Online (Sandbox Code Playgroud)

CSRF位确保页面请求来自您自己的站点,而不是cURL请求或嵌入其他人的网站.http://expressjs.com/api.html#csrf了解更多相关信息.

  • @gluxon确实如此.如果你是幸运的话,uuid通常是几个字符的十六进制字符串,如果你不幸,则是一个长字符串.一个正确长的短语更长,具有更大的符号域.它因此更长,更多样化.至于你的用户选择会话秘密,他们不是.你是.您的用户永远不会看到它. (2认同)
  • 尽管这个答案是彻底的,但它忽略了一个基本问题:PHP和node.js如何管理会话有什么不同?如果解决这个问题,这个答案会大大改善.(答案当然是客户端与服务器端会话.) (2认同)

arg*_*gaz 7

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

我建议阅读它(不仅有相关的最高投票答案).

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

用户可以使用他们想要的任何会话ID.也许有人觉得他们应该使用SQL数据库中的自动递增数字,这没关系,因为我们通过签署值来保护他们不知情的决定,延长密钥.