保护csrf Nodejs表单

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保护csrf Nodejs表单相关的知识,希望对你有一定的参考价值。

我的Nodejs应用程序有点问题。我想用csrf令牌保护我的表单,但它不起作用。我有一个错误

ForbiddenError: invalid csrf token
POST http://localhost:3000/addfile 403 (Forbidden)

我想为所有请求创建csrf令牌。我可以创建csrf令牌,但如果我使用像:POST / PUT或DELETE这样的方法,它就不起作用了。

我不明白为什么我有这个错误。谢谢你的回答。

app.js

var express             = require("express");
var bodyParser          = require("body-parser");
var mongoose            = require('mongoose');
var fs                  = require('fs');
var path                = require('path');
var logger              = require('morgan');
var expressValidator    = require('express-validator');
var csrf                = require('csurf');
var session             = require('express-session');
var passport            = require('passport');
var PORT                = 3000;
var config              = require('./config/database');
var app                 = express();

// Connexion to MongoDb
mongoose.connect(config.database, function(err) {
    if(err){
        console.log(err);
    }
    else{
        console.log("Connected to MongoDb");
    }
});
// Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(expressValidator());
app.set('views',path.join(__dirname, ''));
app.set('view engine','pug');
app.use(express.static(path.join(__dirname, '')));
app.disable('x-powered-by');
app.use(session({
    name: 'SESS_ID',
    secret: config.secret,
    resave: true,
    saveUninitialized: true,
    cookie: {
        secure: false,
        httpOnly: true,
        maxAge: 5*60*1000 } //15minutes*60sec*1000ms
    //cookie: {secure: false}   //https = true, http=false
}));
app.use(csrf());
app.use(passport.initialize());
app.use(passport.session());
require('./config/passport')(passport);

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

app.use('/', require('./routes/fileRoutes'));
app.use('/', require('./routes/authRoutes'));

app.listen(PORT,function(){
    console.log("Server started at the port " + PORT);
});

路线/ fileRoutes.js

app.get('/',function(req,res){
    File.find(function(err, files){
        res.render('views/layout',{files:files});
    });
});
app.post('/addfile',upload,function(req,res){
    if (req.fileValidationError) {
        return res.end("Error PDF");
    } else {
        for (var i = 0; i < req.files.length; i++)
        {
            var files = new File ();  
                files.fieldname= req.files[i].fieldname;
                files.originalname= req.files[i].originalname;
                files.encoding= req.files[i].encodin;
                files.path= req.files[i].path;
                files.save(function(err, data){
            });
        }
        res.redirect('/');
    }
});

layout.pug

form#uploadForm(enctype='multipart/form-data', action='/addfile', method='post')
    input(type='hidden', name='_csrf', value=_csrf)
    input(type='file', name='userPhoto', multiple='')
    input(type='submit', value='Upload Image', name='submit')
    input#random(type='text', name='random')
答案

我看到你有:

input(type='hidden', name='_csrf', value=_csrf)

如果你是console.log(_csrf)的价值是多少?我也注意到你没有把它放在引号中。

以上是关于保护csrf Nodejs表单的主要内容,如果未能解决你的问题,请参考以下文章

何时需要使用令牌保护表单(CSRF 攻击)?

Django:POST 表单需要 CSRF? GET 没有?

HTML中ajax表单提交CSRF保护

Rails - 如何向用 javascript 创建的表单添加 CSRF 保护?

使用 AJAX GET 在缓存页面中生成受 CSRF 保护的表单

将 CSRF 令牌添加到 RestTemplate 获取由表单登录保护的页面的请求