会话密钥在Express web框架中的重要性
会议秘密的重要性使我很困惑。 我正在使用Express和Node进入Web开发,现在我试图实现一个简单的login。 以下代码取自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());
它使用“键盘猫”作为会话密钥。 我查看过的关于会话秘密的许多事情都build议我将其改为自定义。 我现在有3个具体的问题。
- 为什么我在使用PHP之前没有看到这个?
- 什么是会议秘密正在使用?
- 比方说,我改变会话密钥。 我的代码是开源的。 在这种情况下不会改变这个有点多余? 我没有看到要求用户作为一个选项的自定义键。
- 我正在考虑生成一个随机的UUID来填写密钥。 这有问题吗? (在安全方面)
我认为在其他答案中漏掉了重点,那就是secret
参数是否使会话pipe理更加安全。 在Security.StackExchange问题中讨论得很好: 为什么将会话ID直接存储在cookie中是不安全的?
我build议阅读它(不仅最高投票答案有关)。
试图总结一下:在会话ID是大的随机数的情况下,它不会有效地减less会话被猜测和劫持的机会,但是如果会话ID是自定义的,像增加ID那样会显着地有帮助,这是可能在ExpressJS 。
用户可以使用他们想要的任何会话ID。 也许有人觉得他们应该使用SQL数据库中的自动递增数字,这并不重要,因为我们通过签署价值来保护他们的不知情的决定,延长了密钥。
- 因为PHP不是Nodejs。 PHP中的会话pipe理与节点中的会话pipe理不同:节点永远不会死,不像PHP那样不断地被你的服务器守护进程(apache,IIS,你有什么)调用,要求产生一些内容,然后结束它的过程。 节点相当于Apache 加 PHP。
- 它用于encryption会话cookie,以便您可以合理地(但不是100%)确定该cookie不是假的,并且该连接应该被视为具有express的较大会话的一部分。
- 这就是为什么你不把string放在你的源代码中。 你把它作为一个环境variables,并以process.env(“SESSION_SECRET”)的forms读取它,或者使用https://npmjs.org/package/habitat中的
.env
文件,并确保这些文件永远不会触及你的仓库(svn / git exclusion / ignore),以便您的机密数据保密。 - 在您的节点应用程序运行时,秘密是不可变的。 比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"
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());
该CSRF位确保页面请求来自您自己的网站,而不是cURL请求或embedded其他人的网站。 http://expressjs.com/api.html#csrf了解更多信息。
我的困惑是在服务器端会话和客户端会话之间。 在今天之前,我并不知道客户端。 下面是一个清晰的解释。
为什么CherryPy会话不需要密钥?
考虑到服务器端模型,我很困惑在会话中需要encryption的地方。