【问题标题】:CSURF not workingCSURF 不工作
【发布时间】:2016-05-16 07:25:48
【问题描述】:

[开发环境] nodejs v4.2.4 + expressjs v4.13.1 + csurf v1.8.3

我成功安装了 csurf 中间件,但似乎无法正常工作。 我尝试在没有 csrf 输入字段的情况下提交表单以测试它是否有效,并且没有任何错误。所以我将 console.log 代码插入到路由器 js 文件中

console.log(res.locals._csrf);

我收到了“未定义”。

我插入输入字段验证值存在,html结果也没有csrfToken

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

我能做什么?这是html源码

<form class="form" method="post" action="/login" role="form">
                <input type="hidden" name="_csrf" value="{{_csrf}}">
                    <div class="form-group label-floating">
                        <label class="control-label" for="focusedInput1">User Name</label>
                        <input class="form-control" name="userName" id="focusedInput1" type="text">
                    </div>

                    <div class="form-group">
                      <div class="form-group label-floating">
                        <label class="control-label" for="focusedInput2">password</label>
                        <input class="form-control" name="user_pw" id="focusedInput2" type="password">
                    </div>
                    </div>

                    <div class="form-group">
                        <button type="submit" class="btn btn-primary" style="float:left">Login</button>
                        <button type="button" class="btn btn-default" style="float:right" data-dismiss="modal">Cancel</button>
                    </div>
                </form>

这是 app.js

// module importing
var express = require('express'),
path = require('path'),
favicon = require('serve-favicon'),
logger = require('morgan'),
cookieParser = require('cookie-parser'),
bodyParser = require('body-parser'),
exphbs = require('express-handlebars'),
mongoose = require('mongoose'),
csrf = require('csurf');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);

var routes = require('./routes/index');
var users = require('./routes/users');

var credentials = require('./credentials.js');

var app = express();

// mongoose Setup
mongoose.connect(credentials.mongooseRsrc.collUrl);

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.engine('.hbs', exphbs({defaultLayout: 'single', extname: '.hbs'}));
app.set('view engine', '.hbs');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser(credentials.cookieSecret));
app.use(session({
    resave: false,
    saveUninitialized: false,
    secret: 'sfbsesc',
    store: new MongoStore({
        mongooseConnection: mongoose.connection
    })
}));
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

app.use(csrf());
app.use(function(req, res, next){
    res.locals._csrf = req.csrfToken();
});
//skip

【问题讨论】:

  • req.csrfToken() 也未定义吗?
  • 我收到的消息是'req.csrfToken 不是函数'
  • router.get('/', function(req, res, next) { console.log(req.csrfToken()); res.render('index', {title: 'Express' ,}); });

标签: javascript node.js express csrf


【解决方案1】:

我遇到了同样的问题,并通过控制器传递令牌来解决它。

在您的路由控制器中,对于您的 POST /login,将令牌作为响应对象传递。

router.post('/login', (req, res) => {
  res.render('login', {
    _csrfToken: req.csrfToken(),
  });
}); 

这可能会导致其他路由出现问题,具体取决于它们的设置方式,但如果您遇到错误提示令牌无效,您可能只需要将其传递到该路由中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2015-11-10
    • 2017-05-18
    • 2015-08-24
    • 2014-08-26
    • 2020-07-09
    相关资源
    最近更新 更多