【发布时间】:2019-09-23 09:03:05
【问题描述】:
我一直在努力实现 CSRF 令牌生成,我不知道自己做错了什么。
server.js:
// set up ======================================================================
var express = require('express');
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var fs = require('fs');
var csrf = require('csurf');
.
.
.
var app = express();
app.use(csrf());
app.use(function(req, res, next) {
res.locals.token = req.csrfToken();
next();
});
.
.
.
login.ejs:
<form action="/login" method="post">
<!--form fields-->
</form>
.
.
.
<input type="hidden" name="_csrf" value="<%= token %>">
当我尝试打开登录页面时,我在 node.js 控制台中得到以下信息:
token is not defined
.
.
.
GET /login 500 93ms - 1.64kb
\
编辑:server.js 现在看起来像这样:
var express = require('express');
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var fs = require('fs');
var csrf = require('csurf');
.
.
.
var app = express();
require('./config/express')(app, __dirname);
require('./config/routes')(app);
app.use(csrf());
app.use(function(req, res, next) {
res.locals.token = req.csrfToken();
next();
});
登录页面现在加载,但 CSRF 令牌未定义。
【问题讨论】:
-
您的输入字段不应该在表单中吗?
-
是的,这对我来说有点疏忽。不过,修复后我仍然遇到同样的错误。
-
您显示的
app.use()语句是否出现在所有路由之前?您的/login路由似乎在两个中间件之前。 -
在路由之后移动 app.use() 语句允许登录页面加载,但现在 csrf 令牌未定义。
-
不,那些
app.use()行肯定需要在您的路线之前出现。否则token绝对不会为视图定义。如果即使在路由之前的行中您也遇到相同的错误,那么res.locals必须在这些中间件之后的某个地方被覆盖。
标签: javascript node.js csrf