【问题标题】:Node.js -- CSRF Token not definedNode.js -- 未定义 CSRF 令牌
【发布时间】: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


【解决方案1】:

您在表单中的值是错误的。

不应该只是

value=""

而是

value=""

【讨论】:

    【解决方案2】:

    尝试:

    首先安装 csurf 模块(https://github.com/expressjs/csurf):

    $ npm install csurf
    

    在 server.js 中

    var router = express.Router();
    var csrf = require('csurf');
    
    var csrfProtection = csrf();
    router.use(csrfProtection);
    
    router.get('/user/login/', function(req, res, next){
        res.render('user/login', {csrfToken: req.csrfToken()});
    });
    

    在 login.ejs 中:

    <input type="hidden" name="_csrf" value="<%= csrfToken >">
    

    // 你需要 =

    【讨论】:

      猜你喜欢
      • 2014-08-26
      • 2020-07-09
      • 2020-03-12
      • 2015-11-22
      • 2017-08-06
      • 2019-03-22
      • 1970-01-01
      • 2016-12-13
      • 2019-07-20
      相关资源
      最近更新 更多