我对 session key 的重要性感到很困惑。我正在使用 Express 和 Node 进行 Web 开发,目前,我正在尝试实现一个简单的登录。以下代码取自 Express 中的 session 示例。
// 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());
它使用“键盘猫”作为 session secret 。我环顾四周的关于 session secret 的许多事情都建议我将其更改为自定义的东西。我现在有 3 个与此相关的具体问题。
- 为什么我以前在使用 PHP 时没有看到这个?
- session key 的具体用途是什么?
- 假设我更改了 session key 。我的代码是开源的。在那种情况下,改变它会不会有点多余?我没有看到要求用户提供自定义键作为选项。
- 我正在考虑生成一个随机 UUID 来填充 key 。这有问题吗? (在安全方面)
最佳答案
- 因为 PHP 不是 Nodejs。 PHP 中的 session 管理与 Node 中的 session 管理不同: Node 永不消亡,与 PHP 不同,PHP 会不断地由您的服务器守护程序(apache、IIS、您有什么)调用,要求生成一些内容,然后结束其进程。 Node 相当于 Apache plus PHP。
- 它用于加密 session cookie,以便您可以合理(但不是 100%)确定 cookie 不是假的,并且应将连接视为与 express 更大 session 的一部分。
- 这就是为什么您不将字符串放在源代码中的原因。您将其设为环境变量并将其作为 process.env("SESSION_SECRET") 读入,或者使用带有 https://npmjs.org/package/dotenv 的
.env
文件,并确保这些文件永远不会触及您的存储库(svn/git exclude/ignores),以便您的 secret 数据保持 secret 。 - 当您的 Node 应用程序运行时, secret 是不可变的。提出一个长而有趣的句子比 UUID 要好得多,UUID 通常比
短得多“我不认为我需要一个 secret ,但是 Stackoverflow 上的一些随机数告诉我 Express 需要一个所以在这里我们是”
。
我如何使用 session :
.env 文件(始终在我的 .gitignore 文件中,因此它永远不会访问我的公共(public)存储库):
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 请求或嵌入到其他人的网站。 http://expressjs.com/api.html#csrf了解更多信息。
关于php - Express Web 框架中 session key 的重要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18565512/