Express jeton CSRF de validation
Je vais avoir des problèmes avec les jetons CSRF. Quand je soumettre un formulaire, une nouvelle XSRF-TOKEN
est généré mais je pense que je suis générant deux jetons différents, je suis un peu confus. Il y a aussi un gage appelé _csrf
, donc je ne vois deux témoins dans les outils de développement (XSRF-JETON et _csrf), _csrf
ne change pas après un post.
Ce que je veux faire est de générer un nouveau jeton pour chaque poste de la demande et vérifier si elle est valide ou pas. Une chose que je sais que je devrais le faire pour la sécurité, mais je suis bloqué.
Il a été une longue journée et je suis nouveau dans l'Express et NodeJS.
Voici ma configuration actuelle.
var express = require('express')
, passport = require('passport')
, flash = require('connect-flash')
, utils = require('./utils')
, csrf = require('csurf')
//setup route middlewares
,csrfProtection = csrf({ cookie: true })
, methodOverride = require('method-override')
, bodyParser = require("body-parser")
, parseForm = bodyParser.urlencoded({ extended: false })
, cookieParser = require('cookie-parser')
, cookieSession = require('cookie-session')
, LocalStrategy = require('passport-local').Strategy
, RememberMeStrategy = require('../..').Strategy;
var app = express();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.engine('ejs', require('ejs-locals'));
app.use(express.logger());
app.use(express.static(__dirname + '/../../public'));
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(methodOverride());
app.use(express.session({ secret: 'keyboard cat' }));
app.use(flash());
//Initialize Passport! Also use passport.session() middleware, to support
//persistent login sessions (recommended).
app.use(passport.initialize());
app.use(passport.session());
app.use(passport.authenticate('remember-me'));
app.use(app.router);
app.use(csrf());
app.use(function (req, res, next) {
res.cookie('XSRF-TOKEN', req.csrfToken());
res.locals.csrftoken = req.csrfToken();
next();
});
Routes
app.get('/form', csrfProtection, function(req, res) {
//pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken()});
});
app.post('/process', parseForm, csrfProtection, function(req, res) {
res.send('data is being processed');
});
envoyer.ejs (/formulaire GET)
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
Favorite color: <input type="text" name="favoriteColor">
<button type="submit">Submit</button>
</form>
- Veuillez vous référer à: CSRF Configurations de travail avec les Cookies. C'est de travailler pour moi.
Vous devez vous connecter pour publier un commentaire.
Basé sur la quantité de code que vous avez partagée, un peu les choses ne sont pas correctes:
1 . Vous pouvez avoir besoin de swap de ces lignes pour que csrf s'exécute avant que les routes.
2 . Ces lignes doivent être placées avant les routes.
3 . Utilisation
locals.csrftoken
dans votre formulaireForbiddenError: invalid csrf token
erreur maintenant. J'ai édité la question un petit peu, j'espère que c'est plus clair maintenant.TypeError: req.csrfToken is not a function
erreur maintenant. Ne devrions-nous pas utiliser leapp.use(csrf()
avant laapp.use(function)
partie?req.csrfToken()
de trop nombreuses fois. Il devrait y avoir une seule génération du jetonapp.use(function (req, res, next) { var csrfToken = req.csrfToken(); res.cookie('XSRF-TOKEN', csrfToken); res.locals.csrftoken = csrfToken; next(); });
le jeton dans le cookie sera complètement différent de celui dans l'express de la session. vous souhaitez vérifier l'un ou l'autre pas les deux.
je voudrais désactiver les cookies entièrement! comme il a travaillé pour moi.
l'auteur mentionne ici
https://github.com/expressjs/csurf/issues/52
prochaine, vous voulez les "X-CSRF Token" à l'en-tête sur ajax post ici:
Express.js jeton csrf avec jQuery Ajax
Code ci-dessous est de travailler pour moi. Laissez-moi savoir dans le cas où vous avez encore confrontés à problème.
Que mentionné que vous souhaitez utiliser les cookies, vous devez faire csurf conscient que vous êtes en utilisant des cookies pour le réglage du jeton CSRF.
Etape 1: Configuration
Etape 2: Dans la route,
Etape 3: Inclure un champ caché dans le code HTML de jeton csrf Exemple: